これが、ソケットの読み取りが通常どのように機能するかです。ループバックより遅い「ネットワーク」を使用すると、すべてのデータがすぐに転送されません。
read(bytes, 0, num)
利用可能なデータがある場合に返されます。1 つまたは複数のバイトが存在する場合があり、それ以上のnum
バイトが使用可能な場合もあります。配列num
に移動されるデータの量のみを制限します。bytes
そのため、excatlynum
バイトを受信したい場合は、再度呼び出す必要がありますread
。もちろん、より小さなパラメーターlen
とより大きなoff
パラメーターを使用します。
例:
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;
}