我目前正在開發一個分佈式系統課程,我們必須在java中實現一個小型傳感器網絡。傳感器每隔x秒將溫度發送到一個管理節點(也是一個傳感器),記錄它們。根據請求,用戶節點連接到管理節點並接收檢測到的溫度的平均值。 其中一個問題是管理節點可能「失敗」。在發生故障之前,它實際上向用戶節點發送消息,需要將特殊數據包發送到其他常規節點之一,這些常規節點將成爲新的管理員。 用戶節點通過TCP連接與管理員進行通信,通過它發送「請求」數據包並接收包含溫度的數據包。我目前使用java.net.socket來實現這一點。阻止從輸入TCP套接字讀取
管理失敗時出現問題。在正常情況下,可以創建一個新的線程,等待來自服務器的這個「失敗」消息,然後用新選擇的管理節點創建一個新的套接字。但是,如果管理員在響應用戶請求發送消息之前失敗,則用戶節點將無限期等待,因爲它正在從輸入流中讀取數據。
特別地,我使用下列行來創建插座和輸入流:
this.socket = new Socket(this.serverAddress,this.serverPort);
this.in = new DataInputStream(socket.getInputStream());
並且在while循環以下行讀取響應溫度。
String data = in.readUTF();
你會如何處理這種情況?
此外,我正在考慮使用相同的TCP連接從管理節點接收「失敗」消息。我怎樣才能支持這個?
當管理節點出現故障時'Stream'不會死掉嗎? –
您是否爲用戶節點輸入流使用單獨的線程? ;在運行用戶節點輸入流的線程上向處理程序添加超時。 – Kickaha
@ bmorris591是的,當TCP連接結束時,流停止,因此引發異常。所以我在想,當我收到這個例外時,我可以開始選擇新管理員的程序。但是,在正常情況下,當接收到「失敗」消息時,它是另一個處理此事的線程。因此,可能會發生異常並引發該過程,然後收到「失敗」並重新啓動該過程 – markusian