丢弃来自套接字的输入数据。

5

来自 Socket 文档:

shutdownInput

public void shutdownInput()
                   throws IOException

Places the input stream for this socket at "end of stream". Any data sent to the input stream side of the socket is acknowledged and then silently discarded.

If you read from a socket input stream after invoking shutdownInput() on the socket, the stream will return EOF.

为了测试服务器中客户端之间的交互,我写了一些客户端机器人。 这些机器人生成一些随机的客户端请求。由于它们只需要向服务器进行写操作,所以它们不需要输入流,也不需要读取服务器发送的更新。以下是机器人主体代码:
private void runWriteBot(PrintWriter out) throws IOException {
    //socket.shutdownInput();
    String request;
    System.out.println("Write bot ready.");
    while (!quit) {
        request = randomRequest();
        out.println(request);
        sleep();
    }
}

如果我取消注释shutdownInput,服务器的客户端处理程序将抛出异常:

连接重置

我没想到在套接字的另一侧会抛出异常。文档(至少对我而言)表明,由另一方发送的任何内容都将被静默地丢弃,不会对另一端的活动造成干扰,即不会导致对方抛出异常。
  1. 我可以忽略服务器发送的内容吗,还是应该排空输入流?

  2. 是否有自动处理方式,还是需要定期读取并忽略?

1个回答

5
当您调用shutdownInput()时的行为取决于平台。
  1. BSD Unix将默默地丢弃任何进一步的输入。
  2. Linux将继续缓冲输入,这最终会阻塞发送者或导致他在非阻塞模式下获取EAGAIN/EWOULDBLOCK。
  3. 如果有任何进一步的数据到达,Windows将重置连接。
这由平台而非Java确定。
在大多数情况下,我看不到调用shutdownInput()的必要性。它真正有用的唯一事情是解除读取的阻塞。在您的情况下,您需要读取服务器响应。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接