丢弃套接字的输入

时间:2013-10-05 18:51:06

标签: java sockets inputstream

来自Socket文档:

  

shutdownInput

public void shutdownInput()
                   throws IOException
     

将此套接字的输入流置于“流结束”。发送到套接字输入流端的任何数据都会被确认,然后以静默方式丢弃。

     

如果在套接字上调用shutdownInput()后从套接字输入流中读取,则流将返回EOF。

为了测试服务器中客户端之间的交互,我编写了一些客户端 bots 。 这些机器人生成一些随机的客户端请求。由于这些只写入服务器,因此不需要输入流,也不需要读取服务器发送的更新。这是机器人的主要代码:

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,则会在服务器的客户端处理程序中抛出异常:

  

连接重置

我没想到会在套接字的另一端抛出异常。文档建议(至少对我来说)另一方发送的任何内容都会被静默丢弃,不会干扰另一端的活动,而不会让另一方抛出异常。< / p>

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

  2. 是否有自动方式,或者我是否需要定期阅读和忽略?

1 个答案:

答案 0 :(得分:4)

调用shutdownInput()时的行为与平台有关。

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

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