java - 两个客户端在java中向服务器发送消息

标签 java

这是一个简单的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/

相关文章:

java - 性能测试中的第一个循环较慢

java - IntelliJ 中的 Grails 默认内存设置

java - 字符串转十六进制

java - 用 Java 读取 Dxf 文件

java - 如何使用Socket将文件从服务器传输到Android Mobile

java - 从 Path 中捕获元素

java - 我可以将 jar 添加到 Maven 2 构建类路径而不安装它们吗?

java - 无法使用 Sdk 23 检查 fragment 中的权限?

java - Gradle:从应用脚本导入插件类

java - 使用 JMS 使用用户名但不使用密码访问 IBM MQ 8