【问题标题】:SocketException Connection ResetSocketException 连接重置
【发布时间】:2011-07-05 07:45:15
【问题描述】:

我创建了一个接受 TCP 连接的服务器。连接到套接字后,它循环从输入流中读取数据。

步骤:

  1. 我启动了我的服务器。
  2. 启动客户端。

现在我要关闭客户端了。

然后服务器给我 SocketException Connection Reset

在从输入流读取之前,我如何检查我的客户端是否处于活动状态。

【问题讨论】:

  • 请告诉我们你到目前为止做了什么。什么是服务器端,什么是客户端。还要粘贴堆栈跟踪以更好地了解您的问题到底是什么。
  • 您还必须穿上 一些 代码示例,以了解您在服务器中到底在做什么

标签: java sockets networking tcp tcpsocket


【解决方案1】:

如果您的服务器收到“连接重置”,它可能正在写入已被另一端关闭的连接。用户按下“返回”按钮的浏览器就是一个很好的例子。如果这是预期情况,请忽略异常。如果它构成应用程序协议错误,请调试应用程序。

【讨论】:

    【解决方案2】:

    有两种方法可以检查套接字是否已连接,您可以读取或写入它,如果已连接则不会出错,如果未连接则会出错。这就是我检查套接字是否已连接的方式:

    BufferedReader reader;
    
    public void run()
    {
        try
        {
            String message;
            while((message = reader.readLine())!=null) //The thread stops here untill the reader has somthing to read
            {
                System.out.println(message);
            }
         }catch(Exception e)
         {
             System.out.println("Client disconnected!");
             // an error is thrown when reader cannot read the stream because it is closed, you will get a connection reset error.
         }
    }
    

    当 Socket 连接时,阅读器会等待直到有东西被读取(message = reader.readLine())。当客户端断开连接并且 Socket 关闭时,读取器会抛出异常,因为由于流已关闭,因此无法读取任何内容。我希望这会有所帮助!

    【讨论】:

    • 您也可以使用socket.isConnected()socket.isClosed() 方法来检查套接字是否仍然打开。
    • 实际上,如果您阅读那些肉食的描述,它会说返回值是这个;如果某个时间点的套接字已连接,则返回 true,否则返回 false。这是一个你可以做的测试,将客户端连接到服务器,当客户端断开连接并抛出错误时,检查这两个肉类的返回值,它们都会返回 true。
    • @Anantha Sharma:不,这完全不正确。这些方法告诉您是否调用了connect() 或close()。不是另一端做了什么。
    • 我刚刚在@John Detter 提到的场景中检查了这些方法,我发现你们俩都是对的.. 这些方法只显示了服务器端发生的情况(如果你关闭了连接或没有) 而不是相反.. 我想找出答案的唯一方法是尝试阅读内容并寻找异常。
    • @Anantha Sharma 正如我所说,他们会告诉你你的那边发生了什么;正如@John Detter 所说,您可以阅读或写作。不是你在这里说的。
    猜你喜欢
    • 1970-01-01
    • 2013-04-21
    • 1970-01-01
    • 1970-01-01
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    • 2020-01-31
    • 1970-01-01
    相关资源
    最近更新 更多