java - 长时间空闲时,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);
}
}
解决方案
是的,当 TCP/IP 连接空闲时间过长时,它会自动断开您的连接。
您可以通过尝试从套接字读取/写入来确定您的连接是否被中断。如果操作失败,那么您就失去了连接。至少在您尝试接收/发送数据之前执行此操作,以便您的实际操作不会失败。当测试失败时,重新连接套接字并继续您的操作。
推荐阅读
- java - Intellij 如何不将标签放在单独的行上?
- javascript - 弹出窗口内的 Kendo React Grid:为什么 getComputedStyle 为 IE11 和 Edge 返回 null,而不是 Chrome、Opera 和 Firefox?
- c# - C# - 在 ReadAllBytes 之后清除 RAM
- java - 使用从 SQLite 概括的数据填充 RecyclerView/ListView
- ios - 我想将 Apple Pay 集成到我的应用中。Apple 会照顾收款方吗?
- swift - 在 Timer 中调用函数
- python - 我可以使用 pandas to_sql 方法添加约束吗?
- android - Chrome 远程调试控制台不适用于 Android 4.4.4
- sql - 如何将 MS SQL STUFF 与子选择一起使用?
- javascript - 如何确保属性的对象属性存在简单?