丢弃来自套接字的输入

afs*_*tos 5 java sockets inputstream

Socket文档:

关机输入

public void shutdownInput()
                   throws IOException
Run Code Online (Sandbox Code Playgroud)

将此套接字的输入流放置在“流末尾”。任何发送到套接字输入流端的数据都会被确认,然后被静默丢弃。

如果在套接字上调用 shutdownInput() 之后从套接字输入流中读取,则该流将返回 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我取消注释shutdownInput,则会在服务器的客户端处理程序中引发异常:

连接重置

我没想到会在套接字的另一侧抛出异常。该文档表明(至少对我而言)另一方发送的任何内容都将被默默丢弃,不会干扰另一端的活动,不会让另一方抛出异常。

  1. 我可以忽略服务器发送的内容,还是应该清除输入流中的内容?

  2. 有没有什么自动的方法可以做到这一点,还是我需要定期阅读和忽略?

use*_*421 5

您调用时的行为shutdownInput()取决于平台。

  1. BSD Unix 将默默地丢弃任何进一步的输入。
  2. Linux 将继续缓冲输入,这最终会阻塞发送者,或者如果他处于非阻塞模式,则会导致他获得 EAGAIN/EWOULDBLOCK。
  3. 如果有任何进一步的数据到达,Windows 将重置连接。

这是由平台决定的,而不是由 Java 决定的。

我认为shutdownInput()在大多数情况下不需要打电话。它唯一真正有用的是解锁读取。在您的情况下,您将不得不阅读服务器响应。