【问题标题】:Client Server sockets java.net.SocketException: Software caused connection abort: recv failed [duplicate]客户端服务器套接字java.net.SocketException:软件导致连接中止:recv失败[重复]
【发布时间】:2012-09-10 02:16:50
【问题描述】:

可能重复:
java.net.SocketException: Software caused connection abort: recv failed

我正在尝试编写一个客户端服务器对,其中连接整天处于活动状态,客户端等待服务器发送消息。步骤是:

  1. 服务器打开端口并监听连接
  2. 客户端连接并等待数据
  3. 一段时间后(可能是几个小时),服务器将数据发送到客户端
  4. 客户端处理数据并将其返回给服务器
  5. 重复步骤 3 和 4

我可以让步骤 1-4 工作,但是如果我尝试重复步骤 3,我会在标题中收到错误。

这是我在客户端的方法:

private static void waitForInput(SSLSocket sslsocket) throws IOException {
        do {
            try {
                ObjectInputStream ois = new ObjectInputStream(sslsocket.getInputStream());
                ObjectOutputStream oos = new ObjectOutputStream(sslsocket.getOutputStream());

                Object o = (Object) (ois.readObject());
                // excluded code to process data     

                oos.flush();
                oos.writeObject(o);
                oos.reset();
            }
            catch(ClassNotFoundException e){
                System.err.println(e.getMessage());
            }
        } while ( true );
    }

代码在第 4 行失败,第一次它阻塞并等待直到我得到下一位数据,但它没有工作两次。我做错了什么?

【问题讨论】:

  • 什么是“第四行”?它以什么方式失败?你只是说它“不起作用”。
  • 从字面上看,我上面的代码中的第 4 行 ObjectInputStream ois = new ObjectInputStream(sslsocket.getInputStream()); 我得到的错误是标题中的错误 - 'java.net.SocketException:软件导致连接中止:recv failed'

标签: java sockets ssl tcp


【解决方案1】:

当您等待从另一端已关闭的套接字读取数据时,会引发连接中止 IOException,如果您没有意外关闭套接字,请检查您的服务器端代码。 还可以上传服务器端代码进行更深入的分析,也可以尝试发布堆栈跟踪,这将有助于分析。

【讨论】:

  • 啊,你是对的,我正在重置另一端的连接,我需要让它在一天内保持活动状态。
  • @Sarah 不,不是。它是由本地网络堆栈响应传输错误引起的。如果对等端关闭连接,您会从 API 获得 EOS:在这种情况下,是 EOFException。完全错误的答案。 -1.
【解决方案2】:

您可以将oisoos 的声明移出do ... while 循环,因为不需要每次都重新声明它们,可能需要一个try ... catch

private static void waitForInput(SSLSocket sslsocket) throws IOException {
    ObjectInputStream ois = new ObjectInputStream(sslsocket.getInputStream());
    ObjectOutputStream oos = new ObjectOutputStream(sslsocket.getOutputStream());
    do {
        try {

            Object o = (Object) (ois.readObject());
            // excluded code to process data     

            oos.writeObject(o);
            oos.flush();
        }
        catch(ClassNotFoundException e){
            System.err.println(e.getMessage());
        }
    } while ( true );
}

我已经删除了oos.reset(); 并移动了oos.flush();

我相信问题出在oos.reset();,我永远不会重置应该持续数小时或至少部分持续的连接。

此外,该连接已经有一个ois,您不需要其中两个。

【讨论】:

  • 谢谢,是的,正如你提到的,我最终将这些调用移出 do 循环。
猜你喜欢
  • 2010-09-13
  • 2011-10-09
  • 1970-01-01
  • 2017-04-20
  • 2011-02-03
  • 2011-01-04
  • 2019-07-28
  • 2011-02-21
相关资源
最近更新 更多