簡體   English   中英

Java套接字讀取后立即寫入

[英]Java socket write immediately after read

基本上,我要實現的是完成客戶端套接字和服務器套接字之間的ping通信。

該方案應如下所示:

  1. 客戶端建立與服務器的連接。
  2. 客戶端將“ Hello”發送到服務器(通過OutputStream),然后開始從服務器讀取(通過InputStream)
  3. 服務器讀取“ Hello”消息並打印到控制台,然后將“ Hello”發送到客戶端(通過OutputSteam)。
  4. 客戶端從服務器打印響應消息並退出。

服務器套接字

try (ServerSocket serverSocket = new ServerSocket(8080)) {
            while (true) {
                // Blocking here
                Socket socket = serverSocket.accept();
                InputStream inStream = socket.getInputStream();
                OutputStream outStream = socket.getOutputStream();

                String reqMessage = new String(inStream.readAllBytes(), StandardCharsets.UTF_8);
                System.out.println(reqMessage);

                String resMessage = "Hello";
                outStream.write(resMessage.getBytes(StandardCharsets.UTF_8));
                outStream.flush();
                System.out.println(String.format("Message '%s' has been sent to client", resMessage));

                outStream.close();
                socket.close();
            }
        }

客戶端套接字:

Socket socket = new Socket("localhost", 8080);

        OutputStream outStream = socket.getOutputStream();
        outStream.write("Hello Server".getBytes(StandardCharsets.UTF_8));
        outStream.flush();

        InputStream inStream = socket.getInputStream();
        System.out.println("Received from server");
        System.out.println(new String(inStream.readAllBytes(), StandardCharsets.UTF_8));

        outStream.close();
        socket.close();

我的問題:

建立連接后,雙方都被阻塞,沒有人在打印正確的消息,就像他們在等待對方一樣。 一旦關閉客戶端,服務器就會打印所有正確的信息。 但是,如果我從客戶端刪除了“從服務器讀取”部分(即InputStream部分),則雙方都可以正常工作。 我只是感到困惑,為什么它會表現得如此? 如果我想使其正常工作,該如何修改?

謝謝。

您的問題是readAllBytes() 這並不意味着它會讀取所有可用的字節,而是會讀取所有字節,直到流關閉為止。

String reqMessage = new String(inStream.readAllBytes(), StandardCharsets.UTF_8);

將一直阻塞,直到關閉客戶端為止,因為服務器仍在等待“所有”字節。 同時,客戶端正在等待服務器發送某些消息,這當然是無法完成的,因為它仍在等待來自客戶端的更多數據。

無論如何,您都不應該使用字節,因為您正在編寫文本消息。 BufferedReaderInputStreamReader一起使用,例如將PrintWriterOutputStreamWriter一起使用以寫入文本。 不要忘記readLine()需要發送者換行,並在InputStreamReaderOutputStreamWriter指定字符編碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM