2013-04-18 28 views
1

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

+1

当管理节点出现故障时'Stream'不会死掉吗? –

+0

您是否为用户节点输入流使用单独的线程? ;在运行用户节点输入流的线程上向处理程序添加超时。 – Kickaha

+0

@ bmorris591是的,当TCP连接结束时,流停止,因此引发异常。所以我在想,当我收到这个例外时,我可以开始选择新管理员的程序。但是,在正常情况下,当接收到“失败”消息时,它是另一个处理此事的线程。因此,可能会发生异常并引发该过程,然后收到“失败”并重新启动该过程 – markusian

回答

0

您是否考虑过查看Apache MINA?这是Java NIO的一个库。

爪哇NIO是包含类与TCP或UDP

1

只需通过Socket的设置读超时()进行通信的无阻塞插座包。