为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕丝7291255 2024-01-17 20:53:47
这是一个简单的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');        }    }}
查看完整描述

2 回答

?
绝地无双

TA贡献1946条经验 获得超4个赞

正如 Martin Wickman 在他的评论中指出的那样,您需要一个单独的线程。这就是发生的事情。

您的服务器接受连接。现在,在处理该连接之前,它不会执行任何其他操作。

所以你的 client1 打开到服务器的连接。这基本上会占用服务器(因为服务器不是多线程的,也不是以任何其他方式一次处理多个客户端)。在处理完 client1 之前,服务器不会执行任何其他操作。

要解决此问题,您需要创建一个线程来处理客户端对话。因此,您的主循环接受一个新的连接并将其提供给一个全新的线程。然后该线程处理该特定连接,并且主循环返回等待另一个客户端。


查看完整回答
反对 回复 2024-01-17
?
凤凰求蛊

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();

    }


查看完整回答
反对 回复 2024-01-17
  • 2 回答
  • 0 关注
  • 113 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信