当前位置: 首页 > 知识库问答 >
问题:

客户端关闭或客户端重新启动时,Java服务器套接字TCP连接卡在CLOSE_WAIT状态

车明贤
2023-03-14

当执行客户端重新启动或关闭时,服务器端的所有套接字连接都挂起CLOSE_WAIT。用于将序列化数据发送到XDR流中的XdrAble。池是标准KeyedSocketPool的对象。MAXIMUM_RETRY、MAXIMUM_RETYR_BEFORE_RESET_POOL是为重置池连接而定义的常量。关闭连接时我缺少了什么?

公共RESP调用(REQ request、RESP response、int requestLength和int timeOut)引发异常{
Socket Socket=Null;

IOException ioException = null;

short attempts = 0;
boolean needResetPool = false;

while (true)
{
  ioException = null;

  try
  {
    // Get socket (open if not connected)
    socket = (Socket) pool.borrowObject ();
    socket.setSoTimeout (timeOut);

    // Send request
    BufferedOutputStream outputStream = new BufferedOutputStream (socket
        .getOutputStream ());
    XdrBufferEncodingStream xdrIn = new XdrBufferEncodingStream (
        requestLength);
    xdrIn.beginEncoding (socket.getInetAddress (), socket.getPort ());
    request.xdrEncode (xdrIn);
    xdrIn.endEncoding ();
    outputStream.write (xdrIn.getXdrData ());
    outputStream.flush ();
    xdrIn.close ();

    // Read response
    BufferedInputStream inputStream = new BufferedInputStream (socket
        .getInputStream ());
    byte[] buffer = new byte[UreMsgBodyLength.MAXIMUM_MSG_LEN];
    int bytesRead = inputStream.read (buffer);

    if (bytesRead < UreMsgBodyLength.MESSAGE_HEADER_LEN)
      throw new IOException("Socket Read Failed - invalid bytesRead="+bytesRead);


    int encodedLength = bytesRead;
    if ( encodedLength < 0 || ( encodedLength & 3) != 0 )
      encodedLength = UreMsgBodyLength.MAXIMUM_MSG_LEN;

   XdrBufferDecodingStream xdrOut = new XdrBufferDecodingStream (buffer, encodedLength);
    xdrOut.beginDecoding ();
    response.xdrDecode (xdrOut);
    xdrOut.endDecoding ();
    xdrOut.close ();
    return response;
  }
  catch (ConnectException ex)
  {

    ioException = ex;
  }
  catch (IOException ex)
  {

    ioException = ex;

    if (socket != null)
    {
      needResetPool = true;
      try { socket.close (); } catch (Throwable t) {}

      try
      {
        pool.invalidateObject (socket);          // Mark the socket as invalid

      }
      catch (Throwable t)
      {

      }
      socket = null;
    }
  }
  finally
  {    
    if (socket != null)
    {
      try
      {
        pool.returnObject (socket);
      }
      catch (Throwable t)
      {

      }
    }
  }

  if (attempts >= MAXIMUM_RETYR_BEFORE_RESET_POOL && needResetPool)
  {

    pool.clear (pool.getKey ()); // clean all connect for the current server id
  }
  if (attempts >= MAXIMUM_RETRY)
  {

    throw ioException;
  }

  attempts++;

} // while

}

共有1个答案

云宾鸿
2023-03-14

关闭连接时我错过了什么?

服务器没有关闭它的套接字来响应读取EOS(read()返回-1)。这段代码也处理不好。CLOSE_WAIT表示对等方已关闭连接,本地系统正在等待应用程序关闭此端。

 类似资料:
  • 真的需要你帮忙。 我的项目是通过电缆连接两台PC机,并使用tcp套接字将客户端文本框形式的字符串发送到服务器。问题是ATI只能发送一个字符串,然后连接就会关闭。 注意:某个端口上的连接将在表单加载中建立并成功。

  • 我正在开发一个非常简单的Java客户机/服务器系统(只是为了让我的脚沾满套接字)。由于某种原因,我一直收到“套接字已关闭”错误。。。这是我的密码。。 服务器文件 客户端文件 我在客户端的第41行得到了错误,然后在第46行得到了NullPointerException。。 提前感谢您的帮助。我只是想在这里学习。

  • 我使用的代码女巫只允许4个不同端口上的4个连接。此代码正在工作,但当客户端关闭连接时,它无法重新建立连接。连接被拒绝。认为是因为线程关闭。如何解决这个问题?我无法更改端口号... 从套接字导入* BUFF=25 def服务器(主机、端口): 如果名称==“main”:导入线程

  • 问题内容: 我正在通过TCP创建一个Java客户端/服务器应用程序,其中有两个套接字: 一种是交换消息。 二是用于文件传输。 我已经在服务器中创建了两个ServerSockets,以便 通过接受ServerSockets 创建套接字1和2 。 首先,客户端通过第一个套接字发送一些字节, 以便它可以告诉服务器它需要哪个文件。 然后,服务器通过第二个套接字将文件发送给客户端。 客户端收到文件后,尝试将

  • 我试图用java实现一个客户端服务器,在这里我读取客户端中的输入并在服务器中执行UperCase,然后返回客户端并打印UperCase。我使用ObjectOutputStream和ObjectInputStream进行读写,但是当我在客户机中键入一个msg时,程序会显示以下错误: Digite uma msg casa java.io.eofexception位于java.io.datainput

  • 问题内容: 我有一个RMI服务器和一个桌面RMI客户端。重新启动服务器时,客户端出现错误。是否可以在不重新启动客户端的情况下重新启动RMI连接? [编辑]这是堆栈跟踪: 问题答案: 服务器终止后,您将收到一个ConnectException。之后,您可以使用Naming.lookup获取新的服务器对象。