簡體   English   中英

阻止從輸入TCP套接字讀取

[英]Blocking read from an input TCP socket

我目前正在從事一個分布式系統課程的項目,在該項目中,我們必須使用Java實現小型傳感器網絡。 傳感器每隔x秒將溫度發送到一個管理節點(也是一個傳感器),並對其進行記錄。 根據請求,用戶節點連接到管理節點,並接收檢測到的溫度平均值。 問題之一是管理節點可能“失敗”。 在失敗之前,它實際上會向用戶節點發送一條消息,該消息需要將特殊數據包發送到將成為新管理員的其他常規節點之一。 用戶節點通過TCP連接槽與管理員通信,該節點發送“請求”數據包並接收包含溫度的數據包。 我目前正在使用java.net.socket來實現這一點。

當管理員失敗時,問題就來了。 在正常情況下,可以創建一個新線程,等待來自服務器的此“失敗”消息,然后使用新選擇的管理節點創建一個新套接字。 但是,如果管理員在發送消息以響應用戶請求之前失敗,則該用戶節點將無限期等待,因為它正在從輸入流中讀取。

特別是,我使用以下幾行來創建套接字和輸入流:

   this.socket = new Socket(this.serverAddress,this.serverPort);
   this.in = new DataInputStream(socket.getInputStream());

在while循環中的下一行讀取響應溫度。

   String data = in.readUTF();

您如何建議應對這種情況?

另外,我還在考慮使用相同的TCP連接來接收來自管理節點的“失敗”消息。 我該如何支持?

只需通過Socket.SetSoTimeout()設置讀取超時。

您是否考慮過研究Apache MINA? 它是Java NIO的庫。

Java NIO是一個非阻塞套接字包,包含用於與TCP或UDP通信的類

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM