0

可能重复:
java.net.SocketException:软件导致连接中止:recv 失败

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

  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

2 回答 2

0

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

于 2012-09-17T20:24:57.213 回答
0

您可以将声明移出循环ois,因为不需要每次都重新声明它们,可能需要围绕它。oosdo ... whiletry ... 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用于该连接的连接,您不需要其中的两个。

于 2012-09-17T20:50:50.773 回答