丢弃来自套接字的输入

Posted

技术标签:

【中文标题】丢弃来自套接字的输入【英文标题】:Discarding input from socket 【发布时间】:2013-10-12 15:30:08 【问题描述】:

来自Socket 文档:

关机输入

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

连接重置

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

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

    有没有什么自动的方法,还是我需要经常阅读和忽略?

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

以上是关于丢弃来自套接字的输入的主要内容,如果未能解决你的问题,请参考以下文章

在收听来自stdin的C输入的同时收听UDP套接字

来自客户端的Getchar()在套接字编程中

如何在 C# 中的同一线程上收听标准输入和套接字?

Wireshark:如何使用 LUA 强制丢弃数据包?

丢弃用于 TCP 连接的 winsock 内部缓冲区中的排队数据

从套接字和 STDIN 提升 Asio 多线程