我对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字节数组),只要发送方已经发送了不止该数据即可。

谁能解释为什么会这样?我只是想念什么吗?谢谢你。

最佳答案



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



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

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

10-11 03:37