1

我目前正在为分布式系统课程做一个项目,我们必须在 Java 中实现一个小型传感器网络。传感器每隔 x 秒将温度发送到一个管理节点(也是一个传感器),该节点记录它们。根据请求,用户节点连接到管理节点并接收检测到的温度的平均值。问题之一是管理节点可能“失败”。在失败之前,它实际上会向用户节点发送一条消息,该用户节点需要将一个特殊的数据包发送到将成为新管理员的其他常规节点之一。用户节点通过 TCP 连接与管理员通信,通过 TCP 连接发送“请求”数据包并接收包含温度的数据包。我目前正在使用 java.net.socket 来实现这一点。

当管理员失败时,问题就来了。在正常情况下,可以创建一个新线程来等待来自服务器的“失败”消息,然后使用新选择的管理节点创建一个新套接字。但是,如果管理员在发送消息以响应用户请求之前失败,则用户节点将无限期地等待,因为它正在从输入流中读取。

特别是,我使用以下几行来创建套接字和输入流:

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

并在 while 循环中使用以下行来读取响应温度。

   String data = in.readUTF();

您建议如何处理这种情况?

此外,我正在考虑使用相同的 TCP 连接从管理节点接收“失败”消息。我该如何支持这一点?

4

2 回答 2

1

只需通过 Socket.SetSoTimeout() 设置读取超时。

于 2013-04-18T22:21:44.350 回答
0

您是否考虑过研究 Apache MINA?它是 Java NIO 的库。

Java NIO 是一个非阻塞套接字包,包含与 TCP 或 UDP 通信的类

于 2013-04-18T16:02:26.437 回答