阻止从输入TCP套接字读取

时间:2013-04-18 15:36:00

标签: java sockets tcp network-programming

我目前正在开发一个分布式系统课程项目,我们必须在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连接从管理节点接收“失败”消息。我怎么能支持这个?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

你考虑过研究Apache MINA吗?它是Java NIO的库。

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