1

Java ( ) にソケットがありますjava.net.ServerSocket。を使って読みましたInputStream

利用可能な場合、ソケットから数バイトを読みたいと思います。だから私は使用しますInputStream.read(bytes, 0, num)

ローカルでテストすると正常に動作します(127.0.0.1以上)。しかし、インターネットに接続して接続すると、2916バイトしか読み取れません。正確に「num」バイトを読み取り、それらを受信するまで続行しないようにするにはどうすればよいですか?

4

2 に答える 2

2

ネットワークの設定方法に関係があるように思えます。他の何かがデータを送信している可能性があります。別のポートを使用してみましたか?

それでも問題が解決しない場合は、ネットワーク接続を無効にするか、ネットワークから切断して、実際に問題の原因が外部からのものかどうかを確認してください。

于 2012-06-26T21:28:56.660 に答える
2

これが、ソケットの読み取りが通常どのように機能するかです。ループバックより遅い「ネットワーク」を使用すると、すべてのデータがすぐに転送されません。

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;
    }
于 2012-06-27T10:01:24.437 に答える