【问题标题】:java socket server and embedded device - can't handle disconnect properlyjava 套接字服务器和嵌入式设备 - 无法正确处理断开连接
【发布时间】:2009-07-07 08:03:08
【问题描述】:

我正在编写一个应该与某些嵌入式设备通信的服务器。通信协议基于固定长度的报头。问题是我无法让我的服务器正确处理设备的突然断开连接(“突然”是指我刚刚关闭设备的情况)。下面是客户端线程主循环的代码:

while(!terminate) {

        try {
            // Receive the header
            while(totalBytesRead < ServerCommon.HEADER_SIZE) {

                bytesRead = dis.read(headerBuffer, bytesRead, ServerCommon.HEADER_SIZE - bytesRead);
                if(bytesRead == -1) {
                 // Can't get here!
                }
                else {
                    totalBytesRead += bytesRead;
                }
            }
            totalBytesRead = 0;
            bytesRead = 0;

            type = Conversion.byteArrayToShortOrder(headerBuffer, 0);
            length = Conversion.byteArrayToShortOrder(headerBuffer, 2);
            // Receive the payload
            while(totalBytesRead < length) {
                bytesRead = dis.read(receiveBuffer, bytesRead, length - bytesRead);

                if(bytesRead == -1) {
                 // Can't get here!  
                }
                else {
                    totalBytesRead += bytesRead;
                }
            }
            totalBytesRead = 0;
            bytesRead = 0;

            // Pass received frame to FrameDispatcher

即使我关闭了设备,读取方法仍然返回 0,而不是 -1。这怎么可能?

【问题讨论】:

    标签: java embedded sockets


    【解决方案1】:

    当您正常关闭套接字时,客户端和服务器之间会发送一系列代码来协调此操作(从关闭端的 FIN 代码开始)。在这种情况下,这不会发生(因为您只需关闭设备),因此服务器会想知道发生了什么。

    您可能希望通过超时等方式调查配置,或​​者通过某种定时协议来识别由于没有响应而导致的断开连接(可能是使用 ICMP/UDP 的带外心跳?)。还是像 UDP 这样的无连接协议用于您的通信?

    【讨论】:

      【解决方案2】:

      仅当提供的长度为 0 时,Read 应该返回 0。如果出现错误,则应返回 -1 或引发异常。

      我建议你先调试你的服务器程序。创建一个 java 客户端应用程序(应该很容易做到)。杀死客户端,看看会发生什么。最好使用两台电脑,然后突然拔掉它们。这将更好地模拟您的情况。

      【讨论】:

        【解决方案3】:

        对于无法访问的通信伙伴,TCP 有 30 秒的超时时间。我想如果你等待 30 秒,你应该得到你的 -1。

        【讨论】:

          猜你喜欢
          • 2012-08-27
          • 2014-11-16
          • 2016-02-20
          • 1970-01-01
          • 2012-06-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-03-10
          相关资源
          最近更新 更多