当前位置:  开发笔记 > 编程语言 > 正文

java.net.SocketException:连接重置

如何解决《java.net.SocketException:连接重置》经验,为你挑选了6个好方法。

我试图从套接字读取时出现以下错误.我做了readInt()InputStream,并且我得到这个错误.仔细阅读文档,这表明连接的客户端部分关闭了连接.在这种情况下,我是服务器.

我可以访问客户端日志文件并且它没有关闭连接,事实上它的日志文件建议我关闭连接.那么有人知道为什么会这样吗?还有什么要检查的?当有可能达到阈值的本地资源时,是否会出现这种情况?


我注意到我有以下几行:

socket.setSoTimeout(10000);

就在之前readInt().这是一个原因(长篇故事),但只是好奇,是否存在可能导致指示错误的情况?我在我的IDE中运行了服务器,我碰巧让我的IDE卡在断点上,然后我注意到完全相同的错误开始出现在我自己的IDE中.

无论如何,只要提一下,希望不是红鲱鱼.:-(



1> user207421..:

有几种可能的原因.

    另一端故意重置连接,我不会在这里记录.对于应用软件来说,这种情况很少见,而且通常是不正确的,但商业软件并不为人所知.

    更常见的是,它是通过写入另一端已正常关闭的连接引起的.换句话说,应用程序协议错误.

    当套接字接收缓冲区中存在未读数据时,也可能由关闭套接字引起.

    在Windows中,"软件导致连接中止"与"连接重置"不同,是由您端发送的网络问题引起的.有关于此的Microsoft知识库文章.



2> erickson..:

连接重置只是意味着收到了TCP RST.当您的对等方收到无法处理的数据时会发生这种情况,并且可能有多种原因.

最简单的方法是关闭套接字,然后在输出流上写入更多数据.通过关闭套接字,你告诉你的同伴你已经完成了谈话,它可以忘记你的连接.无论如何,当你在该流上发送更多数据时,对等体用RST拒绝它,让你知道它没有收听.

在其他情况下,介入防火墙甚至远程主机本身可能会"忘记"您的TCP连接.如果您长时间不发送任何数据(2小时是常见的超时),或者因为对等体重新启动并丢失了有关活动连接的信息,则可能会发生这种情况.在其中一个已解除连接的连接上发送数据也会导致RST.


更新以回应其他信息:

仔细看看你对它的处理SocketTimeoutException.如果在套接字操作上阻止超出配置的超时,则会引发此异常.抛出此异常时,套接字本身的状态不会更改,但如果您的异常处理程序关闭套接字,然后尝试写入它,则您将处于连接重置状态.setSoTimeout()是为了给你一个干净的方法来打破一个read()可能会永远阻止的操作,而不会做一些像从另一个线程关闭套接字这样的脏东西.



3> GEOCHET..:

每当我遇到像这样的奇怪问题时,我通常会坐在像WireShark这样的工具上,看看来回传递的原始数据.您可能会对事物断开连接感到惊讶,并且只有在您尝试阅读时才会收到通知.



4> Davut Gürbüz..:

你应该仔细检查完整的痕迹,

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

在我的情况下,它发生在从clientSocket Socket对象读取时,由于某种原因,它关闭了它的连接.(网络丢失,防火墙或应用程序崩溃或打算关闭)

实际上,当我从这个Socket对象读取错误时,我正在重新建立连接.

Socket clientSocket = ServerSocket.accept();
is = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
int readed = is.read(); // WHERE ERROR STARTS !!!

有趣的是,for my JAVA Socket如果一个客户端连接到我ServerSocket并关闭它的连接而没有is.read()递归地发送任何调用本身.它似乎是因为在一个无限的while循环中从这个套接字读取你试图从一个封闭的连接读取.如果您使用下面的内容进行读取操作;

while(true)
{
  Receive();
}

然后你会得到一个类似下面的stackTrace

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(); //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...
            }
        }

我找不到另一种方式,因为你从下面的图像看到你无法理解连接是否丢失try and catch,因为一切似乎都是正确的.我在Connection reset连续不断的时候得到了这个快照.

在此输入图像描述



5> Scott S..:

令人尴尬地说出来,但是当我遇到这个问题时,我在阅读所有数据之前关闭连接只是一个错误.在返回小字符串的情况下,它有效,但这可能是由于整个响应被缓冲,然后我关闭它.

如果返回的文本数量较长,则会抛出异常,因为缓冲区会返回更多.

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



6> kml_ckr..:

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


@DeanHiller在写作过程写完之前,*reading*进程退出.
推荐阅读
U友50081205_653
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有