![](/img/trans.png)
[英]Java socket read not receiving write sent immediately after connection is established
[英]Java socket write immediately after read
基本上,我要實現的是完成客戶端套接字和服務器套接字之間的ping通信。
該方案應如下所示:
服務器套接字 :
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);
將一直阻塞,直到關閉客戶端為止,因為服務器仍在等待“所有”字節。 同時,客戶端正在等待服務器發送某些消息,這當然是無法完成的,因為它仍在等待來自客戶端的更多數據。
無論如何,您都不應該使用字節,因為您正在編寫文本消息。 將BufferedReader
與InputStreamReader
一起使用,例如將PrintWriter
與OutputStreamWriter
一起使用以寫入文本。 不要忘記readLine()
需要發送者換行,並在InputStreamReader
和OutputStreamWriter
指定字符編碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.