1

我有一个使用类 Game 的类TCPServer。我想将所有低级发送和接收分开TCPServer。所以我给出TCPServer了一个单独的线程来不断读取传入的消息。我想将这些消息返回给Game. 但我不知道该怎么做。Game还应该通过向客户端发送消息来对这些消息做出反应。

我认为/知道可以通过将线程从TCPServerto移动,Game但这是解决此问题的最佳方法吗?将两个类分开不是更好吗?

我有以下伪代码。

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

我认为正确的方法是使用BlockingQueues. 而不是在当前线程中发送消息,Game只需将它们添加到sendQueue. 然后TCPServer将有一个接收线程将内容添加到该readQueue和另一个线程将内容从sendQueue该套接字写入。

我现在不太了解您的线程模型。通常,您有一个线程调用accept()aServerSocket然后分叉一个客户端处理程序线程。如果Game要维护许多这些客户端连接,那么您将拥有以下内容:

  1. TCPServer 有一个线程调用accept().
  2. 当它获得连接时,会创建一个ClientHandler对象并将其添加到游戏正在处理的客户端集合中。
  3. 每个ClientHandler都有一个sendQueuereceivedQueue——也许每个都是LinkedBlockingQueue
  4. 每个ClientHandler分叉一个从客户端接收的读取线程并添加到 receivedQueue一个正在等待sendQueue并写入客户端套接字的写入线程。

要做到这一点,这里有很多工作要做。如何在客户端套接字关闭时正确关闭读取器和写入器线程将是一个挑战。

希望这里有帮助。

于 2012-05-08T21:25:38.257 回答