套接字流读取何时返回?

时间:2015-04-30 11:49:32

标签: java android sockets

让我用下面的例子来解释我的问题:

Socket socket = new Socket(); 
socket.setReceiveBufferSize(64*1024);
socket.connect(AddressOfSomeStreamingWithEndlessData, 6000);
InputStream inputStream = socket.getInputStream();
byte[] byteBuffer = new byte[64*1024];
while(true)
{
   //When does the underlying reading decide to return?
   int iRead = inputStream .read(byteBuffer);
}

我想知道系统如何决定返回inputStream .read(byteBuffer)。它不会等到byteBuffer被填满,当有一个字节时它也不会立即返回。这是高度依赖设备的吗?

[更新]:

我基本上使用了上面的代码,并在两个不同的Android平板电脑和模拟器上进行了一些测试,以便从流媒体源接收数据。以下是我对此特定情况的观察结果:

inputStream .read(byteBuffer)返回一个或多个TCP有效负载。这里的有效负载是指TCP段的数据部分(即TCP数据包减去TCP报头)。有效载荷大小明显不同,如果是源发送的,则可以小到一个字节。但是,似乎存在远小于接收器提供的窗口大小(在这种情况下为65536)的上限。这似乎在1000和1500之间也有所不同。例如,对于一个配置,它是1460,所以iRead是1460,2920,4380,5840,....另一个,它是1448.我想强调我我报告我的观察结果,而不是概括任何事情

1 个答案:

答案 0 :(得分:2)

它阻止至少接收到一个字节,或者流结束或发生异常。如果已收到数据,则它会传输所有数据,直到代码指定的限制,并返回传输的字节数。多少取决于接收到的数据量,无法以任何方式预测或控制。

参见Javadoc。