客户端服务器套接字java.net.SocketException:软件导致连接中止:recv失败

时间:2012-09-17 20:16:29

标签: java sockets ssl tcp

  

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

我正在尝试编写一个客户端服务器对,其中连接全天都在运行,客户端等待服务器发送消息。步骤是:

  1. 服务器打开端口并侦听连接
  2. 客户端连接并等待数据
  3. 服务器稍后(可能是几小时)将数据发送到客户端
  4. 客户端处理数据并将其返回给服务器
  5. 重复步骤3和4
  6. 我可以让步骤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行失败,它第一次阻塞并等待直到我得到下一位数据,但它不能工作两次。我做错了什么?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您可以将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,您不需要其中两个。