我有一个Java套接字(java.net.ServerSocket
)。我使用InputStream
读取它。
我想从socket中读取几个字节,当它们可用时。所以我使用InputStream.read(bytes, 0, num)
。
当我在本地测试它(超过127.0.0.1)时,它工作正常。但是,当我把它放在互联网上并连接到它时,它只读取2916字节。如何准确读取“num”字节并且不继续,我接收它们?
答案 0 :(得分:2)
听起来与您的网络设置方式有关。还有其他东西可以向它发送数据。您是否尝试过使用其他端口?
如果这不起作用,请尝试禁用网络连接/断开与网络的连接,以查看是否有来自外部的内容实际导致问题。
答案 1 :(得分:2)
这就是套接字读数通常如何工作的方式。使用较慢的“网络”而不是环回时,不会立即传输所有数据。
当有可用数据时, read(bytes, 0, num)
将返回。可能有一个或多个字节,甚至超过num
个字节。 num
仅限制将数据移至bytes
数组的数量。
因此,如果您想要接收令人兴奋的num
字节,则必须再次呼叫read
。具有较小len
和较大off
参数的cource。
示例:
int offset = 0;
int wanted = buffer.length;
while( wanted > 0 )
{
final int len = istream.read( buffer, offset, wanted );
if( len == -1 )
{
throw new java.io.EOFException( "Connection closed gracefully by peer" );
}
wanted -= len;
offset += len;
}