1

クラスを使用するクラスゲームがありますTCPServer。での低レベルの送受信をすべて分離したいと思いTCPServerます。そこでTCPServer、着信メッセージを常に読み取る別のスレッドを提供します。これらのメッセージをに返したいと思いますGame。しかし、私はこれを行う方法がわかりません。Gameまた、クライアントにメッセージを送信することによって応答するこれらのメッセージに反応する必要があります。

TCPServerスレッドをからに移動することで可能だと思いますGameが、これはこれを解決するための最良の方法ですか?2つのクラスを分けておく方がいいのではないでしょうか。

次の擬似コードがあります。

public class Game{
   TCPServer tcpServer = new TCPServer();

   public void execute(){
       // do something
       Object o = new Object;
       send(o);

       if(receive(o)){  // WRONG
          // do something with the receive object
       }
   }

   private void send(Object o){
      tcpServer.send(o);
   }

   private Object receive(Object o){
      return tcpServer.receive(o);
}

public class TCPServer extends Thread{
   private ServerSocket serverSocket;
   Socket client = new Socket;

   public void run(){
     Object o = receive();
     // How do I get this object o in the Server class in function execute()?
   }

   private Object receive(){
      return serverSocket.listen();

   }

   public void send(Object o){
      client.send(o);
}
4

1 に答える 1

2

これを行う正しい方法は、sを使用することだと思いますBlockingQueue。現在のスレッドでメッセージを送信する代わりに、メッセージをにGame追加するだけsendQueueです。次にTCPServer、に物事を追加する受信スレッドと、からソケットにreadQueue物事を書き込んだ別のスレッドがあります。sendQueue

現在、スレッドモデルがよくわかりません。通常、スレッドがを呼び出しaccept()てからServerSocket、クライアントハンドラスレッドをフォークします。これらのクライアント接続の数を維持している場合Gameは、次のようになります。

  1. TCPServerには、を呼び出すスレッドがありますaccept()
  2. 接続を取得すると、ClientHandlerオブジェクトが作成され、ゲームによって処理されているクライアントのコレクションに追加されます。
  3. それぞれClientHandlersendQueueとがありreceivedQueueます-多分それぞれがLinkedBlockingQueue
  4. それぞれが、クライアントから受信し、クライアントソケットを待機して書き込みを行う書き込みスレッドにClientHandler追加する読み取りスレッドをフォークし ます。receivedQueuesendQueue

これを正しく行うために、ここには多くの作業があります。クライアントソケットが閉じたときにリーダースレッドとライタースレッドの両方を適切にシャットダウンする方法は、課題になります。

ここで何かが役立つことを願っています。

于 2012-05-08T21:25:38.257 に答える