首页 > 解决方案 > 长时间空闲时,Client Socket程序是否有可能断开连接但没有收到任何事件?

问题描述

我有一个充当客户端的套接字程序。当它初始化连接时,服务器会定期发送数据,我的程序会回复。

我已经以这种方式编写了我的程序,当客户端-服务器与套接字/网络断开连接的连接中断时,客户端以异常的形式接收到一个事件,我处理它并在那里使用递归来继续寻找重新建立的连接。

我已经用 Hercules 作为服务器对此进行了测试。

但是当我实际部署应用程序时,经过一段时间后,我看到我的程序在运行时不再接收数据。服务器说客户端没有初始化连接。

所以这里我假设发生的是连接长时间空闲,客户端套接字断开但未收到事件。这会发生吗?

如果是这样,如何处理?我附上了以下示例客户端套接字程序。

public void connect(String ipAddress, int portNo, int updateValue) {
    Socket socket = null;
    try {
        System.out.println("Connecting ...");
        //socket = new Socket("192.168.3.39",3000);
        socket = new Socket(ipAddress,portNo);
        System.out.println("Timeout: "+socket.getSoTimeout());
        InputStream is = socket.getInputStream();
        byte[] buffer = new byte[512];
        try {
            int read;
            while((read = is.read(buffer)) != -1) {
                System.err.println("The Lengh of the buffer is: "+buffer.length);
                ByteArrayOutputStream outputBuffer = new ByteArrayOutputStream();
                String output = new String(buffer, 0, read);
                System.out.println(output);
                outputBuffer.write(buffer, 0, read);

                //Code snippet to write an integer into PLC
                BufferedOutputStream bw = null;
                try {
                    bw = new BufferedOutputStream(socket.getOutputStream());
                    bw.write(Convert.IntToByteArr(updateValue));  //Here I want to write only integers as bytes.
                    bw.flush();   //Flushing the data
                    System.out.println("Data Flushed");
                } catch (Exception e) {
                    System.err.println("Exception: "+e.getMessage());
                }
            };
            connect(ipAddress, portNo, updateValue);
        } catch(SocketException e) {
            System.err.println("SocketException: "+e.getMessage());
            connect(ipAddress, portNo, updateValue);
        }
        System.out.println("******END*****");//This code will never be executed
    } catch (ConnectException e) {
        System.err.println("Connection Exception: "+e.getMessage());
        connect(ipAddress, portNo, updateValue);
    } catch (Exception e) {
        System.err.println("Generic Exception: "+e.getMessage());
        e.printStackTrace();
        connect(ipAddress, portNo, updateValue);
    }
}

标签: javasocketstcpsocket.io

解决方案


是的,当 TCP/IP 连接空闲时间过长时,它会自动断开您的连接。

您可以通过尝试从套接字读取/写入来确定您的连接是否被中断。如果操作失败,那么您就失去了连接。至少在您尝试接收/发送数据之前执行此操作,以便您的实际操作不会失败。当测试失败时,重新连接套接字并继续您的操作。


推荐阅读