Java配列のソケットクラスを使用してバイト配列を送信すると、受信者がデータを受信したことを確認するまで次のコードブロックで書き込み呼び出しを行いますか?データを送信するときにJavaのTCPソケットクラスブロックをブロックします
byte data[] = ...;
Socket socket = ...;
socket.getOutputStream().write(data); // blocking ?
私が尋ねる理由は、私は私がに同じデータを送信するソケットのリストを持っている場合、私は同じ効率、すなわち、できるだけそれを送りたいです、これよりも良い方法があります:
ArrayList<Socket> sockets = ...;
byte data[] = ...;
for(int i = 0; i < sockets.size(); i++)
sockets.getOutputStream().write(data);
これで、データがスタックのtcpレイヤーに到達するとブロック解除され、クライアントとのtcpハンドシェイクが完了するまで待つ必要はありません。 –
@gamemb、ハンドシェークが完了した後でなければ、あなたのコードは 'write()'コールに進まないでしょう。しかし、そうでなければ、_local_ TCP送信バッファが 'write()'呼び出しを受け入れるのに十分なスペースを解放したときに、コードはブロックを解除します。これは64KBですウィンドウ+ 8キロバイトのバッファサイズで、遠隔ピアが受信し、 'ACK 'されたものよりも前にある。 – sarnold
([TCPウィンドウのスケーリング](http://en.wikipedia.org/wiki/TCP_window_scale_option)を使用すると、64KBウィンドウはちょうど推測に過ぎないことに注意してください)、ウィンドウはメガバイト大きく、ほぼ最大1ギガバイトのデータになる可能性があります。それは、転送中に1ギガバイトのデータを持つ特殊な環境を取るでしょう:) – sarnold