2017-04-08 1 views
1

:ここで何が起こっている2つのサーバスレッドを2つのクライアントスレッドと通信させるにはどうすればよいですか?私は基本的にこれを達成したい

ServerThreadA       ClientThreadA 
      \      /
       --->>>--->>>--->>>--- 
         SOCKET 
       --->>>--->>>--->>>--- 
      /      \ 
ServerThreadB       ClientThreadB 

は、私はクライアント側で2つのそれぞれのスレッドにデータを送信するサーバ上で2つのスレッドを持っているということです。具体的には、サーバー上のDataOutputStreamの.writeUTF(String)とクライアントのDataInputStreamの.readUTF()を使用する必要があります。

ServerThreadAがストリームに何かを書き込む場合、ClientThreadAはClientThreadBを読み込みません。同じように、私はClientThreadBにServerThreadAが書いたものを読み込ませたくありません。

私はこれを達成する方法はありますか?

EDIT:
私はすでに説明していないかもしれないと思います:複数の接続を受け入れて、それぞれのサーバーに作業するスレッドを与える方法はすでに分かっています。同じ方向に、同じクライアントで複数の通信が行われます。だから、サーバーがクライアントに接続し、接続を表すスレッドが作成されたとしますが、私がしたいことは2つの異なるチャネルから読み込み、異なるタイプのデータを転送することです。たとえば、クライアントが同時に2つの文字列を送信し、サーバが同時にを読み取るようにしたい場合があります。

答えて

2

各文字列の前に番号を書き込むようにプロトコルを変更します。メッセージがClientThreadA、メッセージがClientThreadBの場合は1です。

サーバー側で、ソケットからすべての入力データを読み取るClientThread0を開始します。それはループ内の数字と文字列を読み込みます。次に、数値に応じて適切なスレッドに文字列を渡します。 ClientThread0からClientThreadA/Bにメッセージを渡すには、BlockingQueue<String>が使用されます。 ClientThread0はqueue.put(string)を呼び出し、ClientThreadA/Bはqueue.take()を呼び出します。

0

サーバの仕組みが間違っていると思います。ポイントがある

ServerThreadA --->>>--->>>--->>>--- ClientThreadA 

ServerThreadB --->>>--->>>--->>>--- ClientThreadB 

::;サーバーコードは、1台のサーバソケット上で待機している絵は非常には次のようになります。新しいクライアントが来たら、accept()はあなたにそのクライアントと話すための "専用の"ソケットを与えます。

つまり、サーバーに接続するクライアントスレッドの数に関係なく、どれくらいの数のサーバスレッドが世話をしても問題ありません。 特定ソケットクライアントが常にあります。

ソケットの共有はありません。したがって、複数のクライアントに行く可能性のあるメッセージについて心配する必要はありません!

ソケットを共有して片方の側が相手にメッセージを送信できるようにしたときは、別の方法を使用する必要があります。

+0

私はよく説明していないかもしれないと思います。私は既に、複数の接続を受け入れることができるサーバーを作成し、それぞれのサーバーに作業のスレッドを与える方法を知っています。同じ方向に、同じクライアントにだから、サーバーがクライアントに接続し、接続を表すスレッドが作成されたとしますが、私がしたいことは2つの異なるチャネルから読み込み、異なるタイプのデータを転送することです。例えば、私はクライアントが2つの文字列を同時に送信し、サーバが同時に*を読むことを望むかもしれません。* –

1

あなたはサーバが渡されたり、クライアントによって呼び出されポート番号を受け入れるサーバーのServerSocketをを使用することができます。

両方とも通信に同じポート番号を使用します。

多くのクライアントがサーバーを呼び出すことができます。クライアント要求(そのポート番号で)がクライアント要求を受け入れると、クライアントがサーバーに参加することを意味します。

+1

私は説明が間違っているかもしれないと思います。複数の接続を受け入れ、私がしようとしていることは、複数の通信を同じ方向に、同じクライアントで行うことです。だから、サーバーがクライアントに接続し、接続を表すスレッドが作成されたとしますが、私がしたいことは2つの異なるチャネルから読み込み、異なるタイプのデータを転送することです。例えば、私はクライアントが同時に2つの文字列を送信し、サーバがそれらを同時に読み取るようにすることができます* –

+1

あなたは2つの異なるクライアントが2つの異なるデータを単一のサーバに送り、サーバが両方のデータを同時に受け入れることを意味します。 –

+1

いいえ、各クライアントは2つの異なるデータをサーバーに送信します。問題は、同時にマルチスレッドを使用して発生しなければならないことです。 –

関連する問題