我有一個看起來客戶端代碼,如:Socket的PrintWriter的不發,直到關閉
Socket s = new Socket(server.getHostName(), server.getPort());
PrintWriter p = new PrintWriter(s.getOutputStream());
p.println(message);
p.flush();
s.shutdownOutput();
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
String newLine;
StringBuffer response = new StringBuffer();
while((newLine = br.readLine()) != null)
response.append(newLine);
System.out.println(response.toString());
p.close();
br.close();
和服務器代碼,看起來像:
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
String nextLine;
StringBuffer request = new StringBuffer();
System.out.println("Starting read....");
String nextline;
while((nextline = br.readLine()) != null){
System.out.println(nextline);
request.append(nextline);
}
System.out.println("Message recived!!");
System.out.println("Request: " + request);
PrintWriter p = new PrintWriter(s.getOutputStream());
p.println("Hello, fileclient!");
System.out.println("Message sent!!");
p.close();
br.close();
在我把線s.shutDownInput()
服務器代碼會掛在br.readLine().
我設法解決的方法是關閉PrintWriter
一些方法,無論是通過p.close()
還是通過當前的方式,其中不關閉 像關閉PrintWriter
通過p.close()
呢。之後,客戶端和服務器之間的交互是完美的。
爲什麼PrintWriter
或BufferedReader
不能發送/接收,直到PrintWriter
以某種方式關閉?
你爲什麼期望它?緩衝是正常的,關閉流迫使它沖洗其內容。 –
我猜他想讓套接字打開,以便發送更多的數據。 –
就像現在的筆記一樣,您應該使用** try-with-resources **自動並正確地關閉像'Socket'這樣的資源。它看起來像這樣:'try(Socket s = new Socket(...)){your code}'。 Java在到達結尾(關閉'}')時自動關閉'try(...)'部分中定義的所有資源。這可以通過實現'AutoCloseable'的一切來完成,這些類有很多類:https://docs.oracle.com/javase/8/docs/api/java/lang/AutoCloseable.html – Zabuza