长时间闲置后,客户端套接字程序是否可能会断开连接但没有收到任何事件?

时间:2019-04-16 05:50:45

标签: java sockets tcp socket.io

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

我已经用这种方式编写程序,当客户端服务器与套接字/网络断开连接之间的连接中断时,客户端会收到异常形式的事件,然后我在该事件中处理并使用递归继续寻找要重新建立的连接。

我已经使用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);
    }
}

1 个答案:

答案 0 :(得分:0)

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

您可以尝试通过尝试从套接字读取/写入来确定连接是否中断。如果操作失败,则说明您已断开连接。至少在尝试接收/发送数据之前,请执行此操作,以免实际操作失败。如果测试失败,请重新连接插座,然后继续操作。