我有一个客户端连接到我的服务器。客户端向服务器发送一些我不关心的消息,如果我不打算使用它们,也不想浪费时间解析它的消息。我使用的所有i / o都是简单的java i / o,而不是nio。
如果我创建输入流并且从不读取它,那么缓冲区是否会填满并导致问题?如果是这样,有什么我可以做的或者我可以设置的属性让它丢弃它看到的数据吗?
现在如果服务器根本不创建输入流怎么办?这会导致客户端/发送方出现任何问题吗?
请告诉我。
谢谢, JBU
答案 0 :(得分:5)
当您accept
来自客户端的连接时,您会收到InputStream
。如果您不从该流读取,则客户端的数据将缓冲。最终,缓冲区将填满,客户端将在尝试写入更多数据时阻塞。如果客户端在从服务器读取响应之前写入其所有数据,则最终会出现相当典型的死锁情况。如果您真的不关心客户端的数据,只需读取(或调用skip
)直到EOF并删除数据。或者,如果它不是标准的请求/响应(如HTTP)协议,则启动一个不断读取流的新线程,以防止它被备份。
答案 1 :(得分:2)
如果您没有从客户端获得有用的数据,那么允许它连接的重点是什么?
答案 2 :(得分:1)
我不确定永远不会从Java中读取缓冲区的含义 - 我猜最终操作系统会停止接受该套接字上的数据,但我不确定是否存在。
为什么不偶尔用大号号码拨打the skip method of your InputStream,以确保丢弃数据?
答案 3 :(得分:0)
我认为一旦接受请求就会获得InputStream,因此如果您不确认该请求,则底层框架(即tomcat)将丢弃该请求(经过一段时间后。)
问候。
答案 4 :(得分:0)
InputStream in = ....
byte[] buffer = new byte[4096] // or whatever
while(true)
in.read(buffer);
如果您接受连接,则应阅读数据。告诉你我从未见过(或可能预见到)这种情况(忽略所有数据的服务器)可能有用的情况。