在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
這看起來似乎很簡單,但我是否過度了?過度簡化它?
我認爲答案取決於你的殘局是什麼。這些關係會長久存在嗎?你在這裏列出的管理代碼是否會決定什麼時候關閉連接/停止線程,或者每個線程在它完成遠程執行的任何任務時自行結束?如果是後者,則可以考慮使用線程池,即'Executors.newFixedThreadPool(n)'(請參閱http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent /Executors.html獲取更多信息) – atkretsch
完成所有設置後,我將啓動一系列可能需要一些時間的自動化任務。每個節點將每100-200毫秒一次,嘗試進入「臨界區」。它會將請求消息放入主線程中的隊列中,並且當請求從隊列中拉出時,節點將向所有鄰居發送請求以允許進入臨界區。 – BigDamnHero