java - socket.setReceiveBufferSize()的使用

标签 java sockets networking tcp

我对 java.net 中 Socket 的 setReceiveBufferSize() 的使用感到困惑。

从 API 中,我知道设置套接字的接收缓冲区大小定义(或提示)套接字一次可以接收的数据限制。然而,每次我尝试从套接字的输入流中读取时,我发现它可以存储比我用 setReceiveBufferSize() 设置的更多的数据。

考虑以下代码:

InputStream input_stream = socket.getInputStream();
socket.setReceiveBufferSize(1024);
byte[] byte_array = new byte[4096];

input_stream.read(byte_array);

每次我从input_stream读取时,我都测试过我一次实际上可以读取超过1024字节(并填充4096字节的数组),只要发送方已经发送不止这么多数据。

谁能解释一下为什么会这样?我只是错过了什么吗?谢谢。

最佳答案

From the API, I know that setting the receive buffer size for the socket defines (or gives a hint to) the data limit that the socket can receive at a time.

不,它没有。它向 TCP 提供有关总接收缓冲区大小的提示,这反过来会影响可以通告的最大接收窗口。 “一次接收”与它没有任何关系。

However, every time I try to read from the socket's input stream, I've found out that it can store more than what I set with setReceiveBufferSize().

TCP 可以自由地向上或向下调整提示。在这种情况下,1024 是一个小得可笑的大小,任何实现都会增加到至少 8192。您可以通过 getReceiveBufferSize() 找出实际使用了多少 TCP。

关于java - socket.setReceiveBufferSize()的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24712577/

相关文章:

java - 当扫描仪读取文本文件时创建对象数组

jvm - 调试 OpenJDK 代码中的 NullPointerException(在 Sun 类中)

java - 关于字节添加和分配的有趣观察

Linux : I programatically changed my default route to eth0 but now I can't ping, 有什么建议吗?

java - 如何在 JFrame 中组织我的 JPanel?

sockets - 在手机上运行服务器,使用蜂窝连接

c - 将 CURL 使用的普通套接字转换为 C 中的 SSL 套接字

python - 停止tornado.TCPServer而不等待连接关闭

c++ - 在网络应用程序中缓冲数据的 OOP 方法

networking - Docker容器无法连接到另一个Docker容器打开的端口