这是一个简单的java程序,它从客户端发送一个字符串到服务器,服务器将字符串的长度返回给客户端。
首先,我运行服务器,然后运行客户端,输入字符串但不按 Enter
,然后运行第二个客户端,输入字符串并按 Enter
。然后,在按下第一个客户端的 Enter
之前,第二个客户端不会收到响应。我该如何解决这个问题?
TCP 客户端
public class TCPClient {
public static void main(String[] args) throws Exception {
String sentence;
String sentenceLength;
BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
Socket clientSocket = new Socket("mycomputer", 6789);
DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
sentence = inFromUser.readLine();
outToServer.writeBytes(sentence + '\n');
sentenceLength = inFromServer.readLine();
System.out.println(sentenceLength);
clientSocket.close();
}
}
TCP 服务器
public class TCPServer {
public static void main(String[] args) throws Exception {
String clientSentence;
int clientSentenceLength;
ServerSocket welcomeSocket = new ServerSocket(6789);
while (true) {
Socket connectionSocket = welcomeSocket.accept();
BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
clientSentence = inFromClient.readLine();
clientSentenceLength = clientSentence.length();
outToClient.writeBytes(clientSentenceLength + "" + '\n');
}
}
}
最佳答案
正如 Martin Wickman 在他的评论中指出的那样,您需要一个单独的线程。这就是正在发生的事情。
您的服务器接受连接。现在,在处理该连接之前,它不会执行任何其他操作。
因此您的 client1 打开与服务器的连接。这基本上会占用服务器(因为服务器不是多线程的,也不是以任何其他方式一次处理多个客户端)。在处理完 client1 之前,服务器不会执行任何其他操作。
要解决此问题,您需要创建一个线程来处理客户端对话。因此,您的主循环接受一个新的连接并将其提供给一个全新的线程。然后该线程处理该特定连接,主循环返回等待另一个客户端。
关于java - 两个客户端在java中向服务器发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58626072/