我有一个充当客户端的套接字程序。初始化连接时,服务器会定期发送数据,并且我的程序会回确认。
我已经用这种方式编写程序,当客户端服务器与套接字/网络断开连接之间的连接中断时,客户端会收到异常形式的事件,然后我在该事件中处理并使用递归继续寻找要重新建立的连接。
我已经使用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);
}
}
答案 0 :(得分:0)
是的,当TCP / IP连接闲置时间过长时,它将自动断开您的连接。
您可以尝试通过尝试从套接字读取/写入来确定连接是否中断。如果操作失败,则说明您已断开连接。至少在尝试接收/发送数据之前,请执行此操作,以免实际操作失败。如果测试失败,请重新连接插座,然后继续操作。