2012-03-01 55 views
2

我有一個DHCP和幾臺PC的本地網絡。其中一個應該是我的服務器,並自動連接到所有其他(客戶端)。我的想法是這樣的: 首先,我在每個正在從服務器(SClient)監聽客戶端程序的客戶端(CServer)上創建一個服務器。當SClient連接到CServer時,SClient向CServer發送他的IP,所以他知道這個IP上會有服務器。然後,在嘗試IP範圍內的所有IP(例如192.168.1.xxx)之後,他啓動真實服務器,所有客戶端連接到已知的服務器IP。 但是,當我嘗試以下操作時,SClient在嘗試連接到192.168.1.0時僅在第一個IP處凍結。我怎樣才能定義一個超時或類似的東西讓SClient放棄不成功的連接並繼續使用192.168.1.1?創建新套接字時添加超時

import java.lang.*; 
import java.io.*; 
import java.net.*; 

class SClient { 
    public SClient() { 
     for(int i = 120; i < 125; i++){ 
      try{ 
       InetAddress addr = InetAddress.getLocalHost(); 
       String addrs = addr+""; 
       String ip = addrs.substring(addrs.indexOf("/")+1); 
       Socket s1 = new Socket("192.168.1." + i, 1254); 

       OutputStream s1out = s1.getOutputStream(); 
       DataOutputStream dos = new DataOutputStream (s1out); 
       dos.writeUTF(ip); 
       dos.close(); 
       s1out.close(); 
       s1.close(); 
      }catch(IOException e){} 
     } 
    } 
} 

import java.lang.*; 
import java.io.*; 
import java.net.*; 

class CServer { 
    public CServer() throws IOException{ 
     ServerSocket s = new ServerSocket(1254); 

     while(true){ 
      Socket s1=s.accept(); 
      InputStream s1In = s1.getInputStream(); 
      DataInputStream dis = new DataInputStream(s1In); 
      String st = new String (dis.readUTF()); 
      System.out.println(st); 
      dis.close(); 
      s1In.close(); 
      s1.close(); 
    } 
} 

}

+1

這可能是因爲你是從192.168.1.0開始的。如果我沒有記錯,一個IP地址永遠不會以0結束,只是子網掩碼會。嘗試從1開始,看看它是否更好。如果這個IP不存在,它應該很快超時。 – 2012-03-02 00:07:03

+0

在這種情況下,我開始於192.168.1.120,因爲我知道我有一個現有的IP在123,但它不會超時。 – 2012-03-02 13:31:07

回答

15

我找到了解決我的問題的方案。這只是初始化插座不

Socket s1 = new Socket("192.168.1." + i, 1254); 

Socket s1 = new Socket(); 
s1.setSoTimeout(200); 
s1.connect(new InetSocketAddress("192.168.1." + i, 1254), 200); 

還是要謝謝你!

+2

如果這解決了您的問題,那麼請接受您自己的答案。你不會得到任何積分(當然!),但它可以幫助其他人閱讀這個問題,因爲他們會知道這是解決方案。 – 2012-03-02 16:14:53

+1

我想接受我自己的答案,但我必須再等16個小時。然後我會做。 – 2012-03-03 07:16:21

1

它更容易使用UDP做到這一點。通用邏輯將是:

  1. 確定一個衆所周知的端口,用於「發現」
  2. 該啓動如果響應未接收到該消息發出一個「查詢主服務器」消息
  3. 任何機在您定義的時間範圍 內,那麼發送它的機器會自動指定 本身作爲服務器。
  4. 今後,這發出一個「查詢主服務器」 消息將得到響應來自主,其IP 地址和「通信端口」
  5. 來自新機器連接到服務器上的任何機器通訊端口 並開始發送消息。

,其中多臺服務器認爲它是在這種情況下主,您可能會遇到的情況,然後你需要一個解決衝突的過程,但輪廓應該給你一個過程,將工作的總體思路爲你。

+0

您需要進行多播並考慮競爭條件。 – 2012-03-02 00:03:42

+0

是的,他確實需要使用多播。你也提到哪些競賽條件? – Perception 2012-03-02 00:55:53

+0

兩臺機器在幾秒鐘內相遇,都向主人發出查詢並且找不到主人(兩者都不是主人)。每個名字都是主人。你現在有2個主人。我想你可以通過先打開多播端口並使用確定性的,絕對的和傳遞性的選舉算法來處理這兩個(或更多)主問題來解決這個問題。那麼既定的主人與新的主人問題呢?這有點頭疼,特別是因爲最初的問題是關於單主機和大量客戶機(都在DHCP上)的情況。 – 2012-03-02 15:03:41