2

SocketChannel着信データを待機しているサーバーにJava が接続されているとします。

SocketChannel server = SocketChannel.open();
server.connect(new InetSocketAddress(ip, port));

そして、以下のようにリクエストを送信します。

byte[] request = "This is a request for server!".getBytes();
ByteBuffer buffer = ByteBuffer.wrap(request);
buffer.flip();
int write = 0;
while (buffer.hasRemaining())
    write += server.write(buffer);
System.out.println(write);

上記のコードは、チャネルにバイトを書き込まないこと0を意味します。

しかし、行を削除すると、buffer.flip()正常に機能し、データが送信されます。

byte[] request = "This is a request for server!".getBytes();
ByteBuffer buffer = ByteBuffer.wrap(request);
int write = 0;
while (buffer.hasRemaining())
    write += server.write(buffer);
System.out.println(write);

どうしてこれなの ?!

4

2 に答える 2

5

私は自分で問題を理解したのでStackOverflow、情報を共有し、同じ問題に直面している他の人に役立つようにここに書いています.

のjava-docによるとByteBuffer.wrap()

新しいバッファの容量と制限は になりarray.length、その位置はゼロになり、そのマークは未定義になります。

そして、Java-doc forにBuffer.flip()は次のように書かれています:

このバッファを反転します。リミットは現在の位置に設定され、次に位置がゼロに設定されます。マークが定義されている場合、それは破棄されます。

答えは明らかです:wrap()バッファの位置をゼロにflip()設定し、バッファのリミットを現在の位置 (ゼロ) にwrite(buffer)設定し、位置からリミットまで開始しますが、どちら0も です。したがって、何も書き込みません!

于 2013-10-01T13:27:13.067 に答える
0

wrap() は、既に反転されたバッファを配信します。もう一度反転すると、基本的に write() または get() の観点から空になります。

于 2013-10-01T22:50:36.657 に答える