gpt4 book ai didi

java - 丢弃来自套接字的输入

转载 作者:搜寻专家 更新时间:2023-11-01 02:47:18 25 4
gpt4 key购买 nike

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

Connection reset

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

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

  2. 是否有任何自动方法可以做到这一点,或者我是否需要定期阅读并忽略?

最佳答案

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

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

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

在大多数情况下,我认为没有必要调用 shutdownInput()。它唯一真正有用的是解除阻塞读取。在您的情况下,您将不得不阅读服务器响应。

关于java - 丢弃来自套接字的输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19201451/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com