0

出于某种原因,当我运行我的服务器代码时,服务器窗口会弹出,但随后它会冻结并且不允许我做任何事情。我已经对我的代码进行了试验,似乎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();
}   
4

3 回答 3

0

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

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

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

于 2013-04-19T01:35:28.777 回答
0

发生的事情是当你调用Socket socket = serverSocket.accept();线程“阻塞”直到它收到一个 connected Socket。并导致你的 GUI 和Socket包含在同一个线程中,你的 GUI 出现无响应。

您要做的是查看线程并在 GUI 的单独线程中运行连接接受代码。这样,您的 GUI 将保持独立于您的线程,并且在您等待连接Socket时不会被阻塞。Socket

于 2013-04-19T01:36:35.453 回答
0

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

看:

于 2013-04-19T01:37:45.530 回答