两个客户端在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');

        }

    }


}


慕丝7291255
浏览 50回答 2
2回答

绝地无双

正如 Martin Wickman 在他的评论中指出的那样,您需要一个单独的线程。这就是发生的事情。您的服务器接受连接。现在,在处理该连接之前,它不会执行任何其他操作。所以你的 client1 打开到服务器的连接。这基本上会占用服务器(因为服务器不是多线程的,也不是以任何其他方式一次处理多个客户端)。在处理完 client1 之前,服务器不会执行任何其他操作。要解决此问题,您需要创建一个线程来处理客户端对话。因此,您的主循环接受一个新的连接并将其提供给一个全新的线程。然后该线程处理该特定连接,并且主循环返回等待另一个客户端。

凤凰求蛊

服务器等待第一个客户端发送句子。这是阻塞线: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();    }
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java