我目前正在开发一个分布式系统课程,我们必须在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