我对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/