【问题标题】:Multithread Server Java多线程服务器 Java
【发布时间】:2013-10-13 15:15:22
【问题描述】:

我正在尝试制作一个可以管理更多客户端的简单 ECHO 服务器。

服务器类:

public class EchoServer {

   protected int          port  ;
   protected ServerSocket socket;
   private   Socket       acceptedSocket;

   public EchoServer(int port) throws IOException {
      this.port = port;
      socket = new ServerSocket(port);
   }

   public void start() throws AcceptingClientException {
      while(!socket.isClosed()) {
         try {
            acceptedSocket = socket.accept();
         }
         catch (IOException e){
            throw new AcceptingClientException();
         }
         ClientHandler ch = new ClientHandler(acceptedSocket);
         ch.run();
      }
   }
}

可运行的客户端处理程序:

public class ClientHandler implements Runnable {

   Socket socket;

   public ClientHandler(Socket socket) {
      this.socket = socket;
   }

   @Override
   public void run() {
      PrintWriter    From_Server = null;
      BufferedReader To_Server   = null;
      String to_server_string    = null;
      try {
         From_Server = new PrintWriter(socket.getOutputStream());
         To_Server   =
            new BufferedReader(
               new InputStreamReader( socket.getInputStream()));
         System.out.println("Stream opened.\n");
         while(true) {
            if(To_Server.ready()){
               System.out.println("Reading input line.\n");
               to_server_string = To_Server.readLine();
               if(to_server_string.equalsIgnoreCase("quit")) {
                  System.out.println("Connection closed on user request.\n");
                  From_Server.print("Bye :)\n");
                  From_Server.close();
                  To_Server.close();
                  socket.close();               
               }
               else {
                  System.out.println(
                     "String '" +
                     to_server_string+"' is not 'quit', echoing.\n");
                  From_Server.print("ECHO: "+to_server_string+"\n");
                  System.out.println("String written on stream, flushing.\n");
                  From_Server.flush();
               }
            }
         }
      }
      catch (IOException e) {
         System.out.println("Stream error (connection closed?).\n");
      }
   }
}

主类

public static void main(String[] args) {
   try {
      EchoServer server= new EchoServer(9999);
      server.start();
   }
   catch (IOException ex) {
      System.out.println("Unable to start server (port is busy?)\n");
      Logger.getLogger(SimpleServer.class.getName()).log(Level.SEVERE, null, ex);
   }
   catch (AcceptingClientException e){
      System.out.println("Unable to accept client\n");
   }
}

不止一个客户端能够连接到服务器,但 ECHO 只能在一个客户端上工作(如果我关闭与一个客户端的连接,服务器将开始自动处理另一个客户端),但我可以'不明白为什么:当客户端连接到服务器时,使用 server.accept() 创建的关联 socked 被传递给以 handler.run() 启动的可运行客户端处理程序的新实例,服务器应该重新启动在 server.accept() 中等待(除非 ServerSocket 已关闭)。 我假设问题应该出在服务器类的这个方法上:

public void start() throws AcceptingClientException {
   while(!socket.isClosed()) {
      try {
         acceptedSocket=socket.accept();
      }
      catch (IOException e){
         throw new AcceptingClientException();
      }
      ClientHandler ch = new ClientHandler(acceptedSocket);
      ch.run();
   }
}

但我无法弄清楚它有什么问题......我错过了什么?

【问题讨论】:

  • 代码太多,发SSCCE
  • 错误在第21行和第22行,剩下的代码我还没看...
  • ready() 测试完全是浪费时间。如果您删除它,代码将继续像现在一样运行,但 CPU 将停止冒烟。

标签: java multithreading sockets


【解决方案1】:

您的代码:

ClientHandler ch = new ClientHandler(acceptedSocket);
ch.run();

不启动新线程,它委托给同一线程中的ClientHandler.run()

要启动线程,请使用new Thread( ch ).start();,因为ch 属于实现RunnableClientHandler 类。

【讨论】:

  • 非常感谢,我什至不知道我是怎么错过的,现在它可以工作了!
  • @Flashgun 您知道吗,当您单击答案旁边的绿色复选标记时,它会将答案标记为“已接受”?这清楚地表明它有效。有关此主题的更多信息,请参阅help center
  • @tbodt:我相信新的 SO 用户不能立即接受答案。
猜你喜欢
  • 2019-05-27
  • 2015-02-10
  • 1970-01-01
  • 1970-01-01
  • 2013-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多