java.net.SocketException:连接重置
尝试从套接字读取时出现以下错误。我正在对该java.net.SocketException:连接重置,java,sockets,networking,connection,socketexception,Java,Sockets,Networking,Connection,Socketexception,尝试从套接字读取时出现以下错误。我正在对该InputStream执行readInt(),我得到了这个错误。仔细阅读文档,这表明连接的客户端部分关闭了连接。在这个场景中,我是服务器 我可以访问客户端日志文件,但它没有关闭连接,事实上,它的日志文件表明我正在关闭连接。有人知道为什么会这样吗?还需要检查什么?当本地资源可能达到阈值时,是否会出现这种情况 我注意到我有以下几行: socket.setSoTimeout(10000); 就在readInt()之前。这是有原因的(说来话长),但只是好奇,
InputStream
执行readInt()
,我得到了这个错误。仔细阅读文档,这表明连接的客户端部分关闭了连接。在这个场景中,我是服务器
我可以访问客户端日志文件,但它没有关闭连接,事实上,它的日志文件表明我正在关闭连接。有人知道为什么会这样吗?还需要检查什么?当本地资源可能达到阈值时,是否会出现这种情况
我注意到我有以下几行:
socket.setSoTimeout(10000);
就在readInt()
之前。这是有原因的(说来话长),但只是好奇,在什么情况下,这可能会导致指示的错误?我让服务器在我的IDE中运行,我碰巧让我的IDE停留在一个断点上,然后我注意到完全相同的错误开始出现在我自己的IDE日志中
不管怎么说,我只想提一下,希望不是在转移注意力-(每当我遇到这种奇怪的问题时,我通常会坐下来用一个类似的工具,查看来回传递的原始数据。当事情断开时,您可能会感到惊讶,只有在尝试读取时才会收到通知。连接重置仅意味着收到TCP RST。当您的对等方接收它无法处理的数据,这可能有各种原因 最简单的方法是关闭套接字,然后在输出流上写入更多数据。通过关闭套接字,您告诉您的对等方您已结束对话,并且它可能会忘记您的连接。当您在该流上发送更多数据时,对等方会用RST拒绝它,让您知道它没有在侦听 在其他情况下,介入的防火墙甚至远程主机本身可能会“忘记”您的TCP连接。如果您长时间不发送任何数据(2小时是常见的超时),则可能会发生这种情况,或者是因为对等方已重新启动并丢失了有关活动连接的信息。在其中一个已失效的连接上发送数据也将导致RST
根据其他信息更新:
仔细查看您对
SocketTimeoutException
的处理。如果在套接字操作上被阻止时超过了配置的超时,则会引发此异常。引发此异常时,套接字本身的状态不会更改,但如果您的异常处理程序关闭套接字,然后尝试对其进行写入,则会导致异常在连接重置条件下。setSoTimeout()
旨在为您提供一种干净的方法来中断read()
操作,否则该操作可能会永远阻塞,而不会执行诸如从另一个线程关闭套接字之类的肮脏操作。有几种可能的原因
我也有同样的错误。我现在找到了问题的解决方案。问题是客户端程序在服务器读取流之前就完成了。说起来很尴尬,但当我遇到这个问题时,我只是错误地在读取所有数据之前关闭了连接。在返回小字符串的情况下,它是有效的,但这是错误的可能是因为在我关闭它之前,整个响应都被缓冲了 如果返回的文本量较长,则会引发异常,因为返回的缓冲区比返回的缓冲区多
你可以检查一下这个疏忽。记住打开URL就像打开一个文件,一定要关闭它(释放连接)一旦它被完全读取。我还遇到了一个Java程序试图通过SSH在服务器上发送命令的问题。问题是机器执行Java代码。它没有连接到远程服务器的权限。write()方法正常,但read()方法方法抛出了一个java.net.SocketException:Connection reset。我通过将客户端SSH密钥添加到远程服务器已知密钥解决了这个问题。我在用java编写的SOA系统中遇到了这个问题。我在不同的物理机上运行客户端和服务器,它们工作了很长一段时间,然后那些令人讨厌的连接Section Reset出现在客户端日志中,而服务器日志中没有任何奇怪的内容。重新启动客户端和服务器并不能解决问题。最后,我们发现服务器端的堆已满,因此我们增加了JVM可用的内存:问题已解决!请注意,日志:memo中没有OutOfMemoryErrorry很稀少,没有精疲力竭。您应该非常仔细地检查完整的跟踪 我有一个服务器套接字应用程序,修复了一个
java.net.SocketException:Connection reset
案例
在我的例子中,它发生在从clientSocketSocket
对象读取时,该对象由于某种原因关闭了其连接。(网络丢失、防火墙或应用程序崩溃或计划关闭)
实际上,当我从这个套接字对象读取数据时出错,我正在重新建立连接
Socket clientSocket = ServerSocket.accept();
is = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
int readed = is.read(); // WHERE ERROR STARTS !!!
有趣的是,如果客户机连接到我的ServerSocket
并关闭,那么我的JAVA Socket的
while(true)
{
Receive();
}
java.net.SocketException: Socket is closed
at java.net.ServerSocket.accept(ServerSocket.java:494)
String Receive() throws Exception
{
try {
int readed = is.read();
....
}catch(Exception e)
{
tryReConnect();
logit(); //etc
}
//...
}
private void tryReConnect()
{
try
{
ServerSocket.close();
//empty my old lost connection and let it get by garbage col. immediately
clientSocket=null;
System.gc();
//Wait a new client Socket connection and address this to my local variable
clientSocket= ServerSocket.accept(); // Waiting for another Connection
System.out.println("Connection established...");
}catch (Exception e) {
String message="ReConnect not successful "+e.getMessage();
logit();//etc...
}
}