2012-11-14 39 views
0

在Java中使用Socket類時,我試圖創建一個由6個客戶端組成的網絡,每個客戶端都相互連接。如何創建客戶端的完整連接圖?

我有體面到目前爲止的想法,我想,我只是不知道如何做到這一點。

基本上,我有一個存儲在字符串數組中的主機名列表。我打開一個ssh連接到我將要使用的每臺機器,然後逐個啓動我的客戶機。

的第一個客戶發現它與InetAddress.getLocalHost().getHostName()主機名,那麼這個比較的主機名列表,並計算出它的節點ID:

for(i = 0; i < hostNames.length; i++){ 
    if(localHostName == hostNames[i]){ 
     NodeID = i; 
     break; 
    } 
    ... 

因此,這裏對我來說最困難的部分:我想在這一點上連接到客戶端在hostNames[i]。我的計劃是爲每個客戶端的每個連接設置不同的線程。我應該如何去創建這些線程?我應該事先設置一個線程數組並在此時定義線程?

Thread[] connections = new Thread[](); 
... 
    //in for loop 
    connections[i] = new Thread(new ConnectionThread().start(hostNames[i])); 
    // ConnectionThread being a tentative name for a custom class 

這看起來似乎很簡單,但我是否過度了?過度簡化它?

+1

我認爲答案取決於你的殘局是什麼。這些關係會長久存在嗎?你在這裏列出的管理代碼是否會決定什麼時候關閉連接/停止線程,或者每個線程在它完成遠程執行的任何任務時自行結束?如果是後者,則可以考慮使用線程池,即'Executors.newFixedThreadPool(n)'(請參閱http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent /Executors.html獲取更多信息) – atkretsch

+0

完成所有設置後,我將啓動一系列可能需要一些時間的自動化任務。每個節點將每100-200毫秒一次,嘗試進入「臨界區」。它會將請求消息放入主線程中的隊列中,並且當請求從隊列中拉出時,節點將向所有鄰居發送請求以允許進入臨界區。 – BigDamnHero

回答

2

馬上你犯了一個新手錯誤:

if(localHostName == hostNames[i]) 

永遠是false,因爲在的Java==運算符比較對象身份 - 即是兩個物體相同對象。你想要的是:

if(localHostName.equals(hostNames[i])) 


接下來,Thread[]想法是好的,但在Runnable傳遞給線程並啓動線程。讓你的類使用一個實例字段來連接主機名(該類不需要知道它自己的主機名)。

事情是這樣的:

public class MyServer implements Runnable { 

    private final String[] hostnames; 

    public MyServer(String... hostnames) { 
     this.hostnames = hostnames; 
    } 

    public void run() { 
     for (String hostname : hostnames) { 
      // connect to hostname 
     } 
    } 

} 

然後在你的主(簡單化):

Thread[] threads = new Thread[6]; 
threads[0] = new Thread(new MyServer("foo", "bar")); 
threads[1] = new Thread(new MyServer("bar", "dog")); 
... 
for (Thread thread : threads) { 
    thread.start(); 
} 
+0

有一天,我會記住不要爲沒有被提醒的字符串做「==」。一天。 否則:Oooooh我喜歡那樣。謝謝! – BigDamnHero