4

我有一个客户端连接到我的服务器。客户端向服务器发送一些我不关心的消息,如果我不打算使用它们,也不想浪费时间解析它的消息。我使用的所有 i/o 都是简单的 java i/o,而不是 nio。

如果我创建输入流并且从不读取它,该缓冲区会填满并导致问题吗?如果是这样,有什么我可以做的或者我可以设置一个属性让它丢弃它看到的数据吗?

现在如果服务器根本不创建输入流怎么办?这会导致客户端/发送方出现任何问题吗?

请告诉我。

谢谢,jbu

4

5 回答 5

5

当您accept从客户端建立连接时,您会得到一个InputStream. 如果您不从该流中读取,则客户端的数据将缓冲。最终,缓冲区会填满,客户端在尝试写入更多数据时会阻塞。如果客户端在从服务器读取响应之前写入所有数据,您将最终遇到非常经典的死锁情况。如果您真的不关心来自客户端的数据,只需读取(或调用skip)直到 EOF 并删除数据。或者,如果它不是标准的请求/响应(如 HTTP)协议,则启动一个新线程,该线程不断读取流以防止它被备份。

于 2009-08-24T16:50:10.977 回答
2

如果您没有从客户端获得有用的数据,那么允许它连接有什么意义?

于 2009-08-24T16:39:01.903 回答
1

我不确定在 Java 中从不读取缓冲区的含义——我猜操作系统最终会停止接受该套接字上的数据,但我不确定那里。

为什么不偶尔用大数字调用InputStream 的 skip 方法,以确保丢弃数据?

于 2009-08-24T16:42:26.263 回答
1
InputStream in = ....
byte[] buffer = new byte[4096] // or whatever
while(true)
  in.read(buffer);

如果您接受连接,您应该读取数据。说实话,我从未见过(或可以预见)这种(忽略所有数据的服务器)可能有用的情况。

于 2009-08-24T16:55:56.267 回答
0

我认为一旦您接受请求就会得到 InputStream,因此如果您不确认该请求,则底层框架(即 tomcat)将放弃该请求(经过一段时间后)。

问候。

于 2009-08-24T16:45:17.303 回答