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



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

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

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

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

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

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

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);
}
}

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

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

最新更新