第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

兩個(gè)客戶(hù)端在java中向服務(wù)器發(fā)送消息

兩個(gè)客戶(hù)端在java中向服務(wù)器發(fā)送消息

慕絲7291255 2024-01-17 20:53:47
這是一個(gè)簡(jiǎn)單的java程序,它從客戶(hù)端發(fā)送一個(gè)字符串到服務(wù)器,服務(wù)器將字符串的長(zhǎng)度返回給客戶(hù)端。首先,我運(yùn)行服務(wù)器,然后運(yùn)行客戶(hù)端,輸入字符串但不按Enter,然后運(yùn)行第二個(gè)客戶(hù)端,輸入字符串并按Enter。Enter然后,在按下第一個(gè)客戶(hù)端之前,第二個(gè)客戶(hù)端不會(huì)得到響應(yīng)。我該如何解決這個(gè)問(wèn)題?TCP客戶(hù)端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服務(wù)器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 回答

?
絕地?zé)o雙

TA貢獻(xiàn)1946條經(jīng)驗(yàn) 獲得超4個(gè)贊

正如 Martin Wickman 在他的評(píng)論中指出的那樣,您需要一個(gè)單獨(dú)的線程。這就是發(fā)生的事情。

您的服務(wù)器接受連接。現(xiàn)在,在處理該連接之前,它不會(huì)執(zhí)行任何其他操作。

所以你的 client1 打開(kāi)到服務(wù)器的連接。這基本上會(huì)占用服務(wù)器(因?yàn)榉?wù)器不是多線程的,也不是以任何其他方式一次處理多個(gè)客戶(hù)端)。在處理完 client1 之前,服務(wù)器不會(huì)執(zhí)行任何其他操作。

要解決此問(wèn)題,您需要?jiǎng)?chuàng)建一個(gè)線程來(lái)處理客戶(hù)端對(duì)話。因此,您的主循環(huán)接受一個(gè)新的連接并將其提供給一個(gè)全新的線程。然后該線程處理該特定連接,并且主循環(huán)返回等待另一個(gè)客戶(hù)端。


查看完整回答
反對(duì) 回復(fù) 2024-01-17
?
鳳凰求蠱

TA貢獻(xiàn)1825條經(jīng)驗(yàn) 獲得超4個(gè)贊

服務(wù)器等待第一個(gè)客戶(hù)端發(fā)送句子。這是阻塞線:clientSentence = inFromClient.readLine();


只有在第一個(gè)客戶(hù)端發(fā)送消息后,代碼才會(huì)繼續(xù),然后第二個(gè)客戶(hù)端才真正被處理Socket connectionSocket = welcomeSocket.accept()


解決的方法是在自己的線程中處理每個(gè)客戶(hù)端。簡(jiǎn)單的原始未經(jīng)測(cè)試的示例代碼:


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

    }

}

然后在服務(wù)器中,從accept()調(diào)用獲得套接字后,您啟動(dòng)一個(gè)新線程來(lái)處理客戶(hù)端:


    while (true) {

        Socket connectionSocket = welcomeSocket.accept();

        new Thread(new ClientHandler(connectionSocket)).start();

    }


查看完整回答
反對(duì) 回復(fù) 2024-01-17
  • 2 回答
  • 0 關(guān)注
  • 230 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)