web-dev-qa-db-ja.com

Javaソケットは全二重をサポートしていますか?

Java OutputStreamSocketに1つのスレッドが書き込み、別のスレッドがソケットのInputStreamから読み取ることは可能ですか?スレッドはソケットで同期する必要がありますか?

54
Tony the Pony

承知しました。あなたが説明している正確な状況は問題ではありません(同時に読み書きします)。

通常、読み取るスレッドがない場合は読み取りスレッドがブロックされ、タイムアウトが指定されている場合は読み取り操作でタイムアウトになる可能性があります。

入力ストリームと出力ストリームはSocket内の別個のオブジェクトであるため、気になる可能性があるのは、2つのスレッドが同時に読み取りまたは書き込みを試みた場合(2つのスレッド、同じ入力/出力ストリーム)がどうなるかです。時間? InputStream/OutputStreamクラスの読み取り/書き込みメソッドは同期されません。ただし、InputStream/OutputStreamのサブクラスを使用している場合は、呼び出す読み取り/書き込みメソッドが同期している可能性があります。 javadocをチェックして、呼び出しているクラスやメソッドを探し、それをすばやく見つけることができます。

47
jefflunt

はい、それは安全です。

InputStreamから複数のスレッドを読み取る必要がある場合は、さらに注意する必要があります(一度に複数のバイトを読み取る場合)。

9
Paul Cager