你应该非常仔细地检查完整的跟踪记录,
我有一个服务器套接字应用程序,并解决了java.net.SocketException:连接重置
的问题。
在我的情况下,它发生在从关闭其连接的客户端 Socket
对象读取时,原因可能是网络中断、防火墙或应用程序崩溃或意外关闭。
实际上,当我从此 Socket 对象读取时遇到错误时,我正在重新建立连接。
Socket clientSocket = ServerSocket.accept();
is = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
int readed = is.read();
有趣的是,对于我的JAVA Socket,如果客户端连接到我的ServerSocket并关闭其连接而不发送任何内容,则会重复调用is.read()
。看起来由于在无限循环中从此套接字读取数据,您尝试从已关闭的连接读取数据。
如果您使用以下代码进行读取操作;
while(true)
{
Receive();
}
然后你会得到一个类似下面的堆栈跟踪信息
java.net.SocketException: Socket is closed
at java.net.ServerSocket.accept(ServerSocket.java:494)
我所做的就是关闭ServerSocket,重新建立连接并等待进一步的客户端连接。
String Receive() throws Exception
{
try {
int readed = is.read();
....
}catch(Exception e)
{
tryReConnect();
logit();
}
}
这可以重新建立我的连接,以解决未知客户端套接字的丢失问题。
private void tryReConnect()
{
try
{
ServerSocket.close();
clientSocket=null;
System.gc();
clientSocket= ServerSocket.accept();
System.out.println("Connection established...");
}catch (Exception e) {
String message="ReConnect not successful "+e.getMessage();
logit();
}
}
由于您可以从下面的图像看到,如果没有使用try和catch
, 您无法判断连接是否中断,因为一切似乎都是正确的,我无法找到其他方法。 我在不断收到Connection reset
的同时获取了这个快照。
![输入图像描述](https://istack.dev59.com/T75Ul.webp)