亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

兩個客戶端在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 關注
  • 177 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號