2013-10-05 57 views
4

Socket从文档:丢弃输入从插座

shutdownInput

public void shutdownInput() 
        throws IOException 

商家在 “流的末尾” 这个插座的输入流。发送到套接字的输入流一侧的任何数据都会被确认,然后以静默方式丢弃。

如果您在套接字上调用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(); 
    } 
} 

如果我取消了shutdownInput,一个例外是在服务器的客户端处理程序抛出:

连接重置

我没预计在socket的另一端会抛出一个异常。文件建议(对我来说,至少)对方发送的任何内容将被默默丢弃,不会干扰对方的活动,即而没有另一方抛出异常。

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

  2. 有没有automagic这样做的方法,还是我需要定期阅读和忽略?

回答

4

调用shutdownInput()时的行为是依赖于平台的。

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

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

在大多数情况下,我看不到需要调用shutdownInput()。它唯一有用的功能是解锁读取。在你的情况下,你将不得不读取服务器响应。