试图用Java制作多个客户端服务器?

时间:2013-04-19 01:24:21

标签: java sockets

出于某种原因,当我运行我的服务器代码时,服务器窗口会弹出,但它会冻结,并且不允许我做任何事情。我已经尝试了我的代码,似乎while循环是问题,因为当我删除它时,它工作正常。但我需要while循环来为许多客户提供服务。这是代码:

注意:变量numClients已经初始化并在其他地方实例化。

  try{

        ServerSocket serverSocket = new ServerSocket(8000);
        textArea.append("Server started on " + new Date() + "\n");          

        while(numClients <= 5){

         Socket socket = serverSocket.accept();

         InetAddress inetAddress = socket.getInetAddress();

             textArea.append("Client \"" + inetAddress.getHostName() + "\" has                          
                             connected!");
         textArea.append("The IP address of \"" + inetAddress.getHostName() +     
                         "\" is   " + inetAddress.getHostAddress());    

         HandleClient task = new HandleClient(socket);
         new Thread(task).start();

         numClients++;

    }
}
catch(IOException ex){
    ex.printStackTrace();
}   

3 个答案:

答案 0 :(得分:0)

方法调用:serverSocket.accept()正在阻塞,这意味着它将停止当前线程,直到有人连接。这意味着如果在读取输入的同一线程中完成,则不会收到用户输入。

这意味着如果没有while循环,您将收到一个连接并保留此代码, 但是使用while循环,您将继续阻止并接收新连接。

要解决您的问题,您需要在单独的线程上运行while循环。

答案 1 :(得分:0)

当您通过Socket socket = serverSocket.accept();线程'阻止'直到收到连接的Socket时,会发生什么。并且导致您的GUI和Socket包含在同一个线程中,您的GUI似乎没有响应。

您要做的是查看线程并在与GUI相关的单独线程中运行连接接受代码。这样,您的GUI仍然独立于Socket线程,并且在Socket等待连接时不会被阻止。

答案 2 :(得分:0)

您不应该尝试让多个线程接受同一端口上的连接。您应该有一个线程接受(多个客户端请求在端口排队),然后您可以生成一个新线程来处理每个接受的连接。

请参阅: