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()
操作,否则该操作可能会永远阻塞,而不会执行诸如从另一个线程关闭套接字之类的肮脏操作。

有几种可能的原因

  • 另一端故意重置了连接,我在这里不作说明。应用软件很少这样做,而且通常是不正确的,但商业软件也不例外

  • 更常见的是,这是由于写入另一端已正常关闭的连接而导致的。换句话说,是应用程序协议错误

  • 当套接字接收缓冲区中存在未读数据时,关闭套接字也可能导致此问题

  • 在Windows中,“软件导致的连接中止”与“连接重置”不同,它是由从您的终端发送的网络问题引起的。Microsoft知识库中有一篇关于这方面的文章


  • 我也有同样的错误。我现在找到了问题的解决方案。问题是客户端程序在服务器读取流之前就完成了。

    说起来很尴尬,但当我遇到这个问题时,我只是错误地在读取所有数据之前关闭了连接。在返回小字符串的情况下,它是有效的,但这是错误的可能是因为在我关闭它之前,整个响应都被缓冲了

    如果返回的文本量较长,则会引发异常,因为返回的缓冲区比返回的缓冲区多


    你可以检查一下这个疏忽。记住打开URL就像打开一个文件,一定要关闭它(释放连接)一旦它被完全读取。

    我还遇到了一个Java程序试图通过SSH在服务器上发送命令的问题。问题是机器执行Java代码。它没有连接到远程服务器的权限。write()方法正常,但read()方法方法抛出了一个java.net.SocketException:Connection reset。我通过将客户端SSH密钥添加到远程服务器已知密钥解决了这个问题。

    我在用java编写的SOA系统中遇到了这个问题。我在不同的物理机上运行客户端和服务器,它们工作了很长一段时间,然后那些令人讨厌的连接Section Reset出现在客户端日志中,而服务器日志中没有任何奇怪的内容。重新启动客户端和服务器并不能解决问题。最后,我们发现服务器端的堆已满,因此我们增加了JVM可用的内存:问题已解决!请注意,日志:memo中没有OutOfMemoryErrorry很稀少,没有精疲力竭。

    您应该非常仔细地检查完整的跟踪

    我有一个服务器套接字应用程序,修复了一个
    java.net.SocketException:Connection reset
    案例

    在我的例子中,它发生在从clientSocket
    Socket
    对象读取时,该对象由于某种原因关闭了其连接。(网络丢失、防火墙或应用程序崩溃或计划关闭)

    实际上,当我从这个套接字对象读取数据时出错,我正在重新建立连接

    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...
                }
            }