Java:忽略输入流 - 缓冲区会溢出并发生坏事吗?

Posted

技术标签:

【中文标题】Java:忽略输入流 - 缓冲区会溢出并发生坏事吗?【英文标题】:Java: ignoring an input stream - will buffers overflow and bad things happen? 【发布时间】:2010-11-22 08:18:36 【问题描述】:

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

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

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

请告诉我。

谢谢, jbu

【问题讨论】:

只有一个问题:你怎么知道在解析它们之前你不应该关心的消息? 【参考方案1】:
InputStream in = ....
byte[] buffer = new byte[4096] // or whatever
while(true)
  in.read(buffer);

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

【讨论】:

【参考方案2】:

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

【讨论】:

+1 建议创建线程以读取/丢弃不需要的数据。这是最简单的稳健解决方案;即它在等待不需要的数据出现时避免了真正的客户端线程阻塞。【参考方案3】:

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

问候。

【讨论】:

【参考方案4】:

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

你为什么不偶尔打电话给the skip method of your InputStream一个大号码,以确保你丢弃数据?

【讨论】:

#skip() 几乎不受所有可能的 InputStreams 支持,因为它没有被强制执行,因此它是一种不能依赖的机制。【参考方案5】:

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

【讨论】:

以上是关于Java:忽略输入流 - 缓冲区会溢出并发生坏事吗?的主要内容,如果未能解决你的问题,请参考以下文章

构建ROP链实现远程栈溢出

缓冲区溢出是与程序堆栈相关的唯一可能的错误吗?

Java中可以进行代码注入吗?

面试官:Redis中的缓冲区了解吗-

20165333 缓冲区溢出漏洞实验

20199319 缓冲区溢出漏洞试验