出于某种原因,当我运行我的服务器代码时,服务器窗口会弹出,但它会冻结,并且不允许我做任何事情。我已经尝试了我的代码,似乎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();
}
答案 0 :(得分:0)
方法调用:serverSocket.accept()
正在阻塞,这意味着它将停止当前线程,直到有人连接。这意味着如果在读取输入的同一线程中完成,则不会收到用户输入。
这意味着如果没有while
循环,您将收到一个连接并保留此代码,
但是使用while
循环,您将继续阻止并接收新连接。
要解决您的问题,您需要在单独的线程上运行while
循环。
答案 1 :(得分:0)
当您通过Socket socket = serverSocket.accept();
线程'阻止'直到收到连接的Socket
时,会发生什么。并且导致您的GUI和Socket
包含在同一个线程中,您的GUI似乎没有响应。
您要做的是查看线程并在与GUI相关的单独线程中运行连接接受代码。这样,您的GUI仍然独立于Socket
线程,并且在Socket
等待连接时不会被阻止。
答案 2 :(得分:0)
您不应该尝试让多个线程接受同一端口上的连接。您应该有一个线程接受(多个客户端请求在端口排队),然后您可以生成一个新线程来处理每个接受的连接。
请参阅: