2 回答
TA贡献1946条经验 获得超4个赞
正如 Martin Wickman 在他的评论中指出的那样,您需要一个单独的线程。这就是发生的事情。
您的服务器接受连接。现在,在处理该连接之前,它不会执行任何其他操作。
所以你的 client1 打开到服务器的连接。这基本上会占用服务器(因为服务器不是多线程的,也不是以任何其他方式一次处理多个客户端)。在处理完 client1 之前,服务器不会执行任何其他操作。
要解决此问题,您需要创建一个线程来处理客户端对话。因此,您的主循环接受一个新的连接并将其提供给一个全新的线程。然后该线程处理该特定连接,并且主循环返回等待另一个客户端。
TA贡献1825条经验 获得超4个赞
服务器等待第一个客户端发送句子。这是阻塞线:clientSentence = inFromClient.readLine();
只有在第一个客户端发送消息后,代码才会继续,然后第二个客户端才真正被处理Socket connectionSocket = welcomeSocket.accept()
解决的方法是在自己的线程中处理每个客户端。简单的原始未经测试的示例代码:
public class ClientHandler implements Runnable {
private Socket socket;
public ClientHandler(Socket socket) {
this.socket = socket;
}
public void run() {
BufferedReader inFromClient = new BufferedReader(new InputStreamReader(socket.getInputStream()));
DataOutputStream outToClient = new DataOutputStream(socket.getOutputStream());
clientSentence = inFromClient.readLine();
clientSentenceLength = clientSentence.length();
outToClient.writeBytes(clientSentenceLength + "" + '\n');
socket.close();
}
}
然后在服务器中,从accept()调用获得套接字后,您启动一个新线程来处理客户端:
while (true) {
Socket connectionSocket = welcomeSocket.accept();
new Thread(new ClientHandler(connectionSocket)).start();
}
添加回答
举报