2012-10-09 19 views
9

私は基本的に望むものは、クライアントがサーバーからの通信をwhile(true)ループでリッスンし続けることです。今私はまた、クライアントがそれを聞いている途中でいくつかのデータをサーバーに送り返すことができるようにしたい。ソケットの読み込みと書き込みを同時に実行する

私が考えることができる唯一の解決策は、読み取りと書き込みのスレッドを作成し、書き込みスレッドを行うたびに読み取りスレッドを中断することです。

は、よりよい解決策はありますかこれは私がこの

+1

あなたの作品の詳細については、投稿を編集してください。何を試しましたか?どのような研究をしましたか?どのコードが機能していないのですか? – Gray

+1

それは問題ではありません - @ CrazyCastaの答えを見てください。 Tx/rxストリームは独立しており、別のスレッドからの書き込みは正常です。 –

+0

R/Wは同時に全二重の定義であり、TCPです。 – irreputable

答えて

6

次の2つのスレッドを使用することができますを行うことができる唯一の方法です。 1つは読書用、もう1つは書込み用です。このようにして、書き込みスレッドは、いつでも書き込みを行うことができます(読み込みを停止する必要はありません)。

もう1つの方法は、readを呼び出す前にソケットでsetSoTimeout(timeoutMs)を使用することです。これにより、読み取りにtimeoutMsミリ秒よりも時間がかかると、SocketTimeoutExceptionがスローされます。

+1

私はタイムアウトの部分とは別にこれに同意します。なぜあなたはそれを望んでいますか?とにかく書くことができます。 –

+0

@TobiasRitzau 2つではなく1つのスレッドを使用できます。私はOPが何をしようとしているのか正確には分からないので、別のオプションを追加していただけです。 – CrazyCasta

+2

そこから発生する重大な同期の問題があります。あなたがタイムアウトした場合、ソケットは閉じられていますか、何か不足していますか? –

-1

リスン用と書き込み用の2つの異なるポートを使用できます。異なるスレッドを使用して操作を行うと、while(true)ループで問題が発生することはありません。

+2

それはソケットがしていることです...すでに全二重をサポートしています。 –

0

FTPプロトコルの仕様を見てください。 2つのソケット/チャンネル(コマンド用とデータ用)を使用して、あなたがしようとしていることを行います。

+1

これは必要ありません。 1つのソケットは、2つの別々のチャネルで送受信するのに十分です。 –

関連する問題