2016-02-17 39 views
1

最近我在看socket通信,在看了幾個教程之後,我發現了類似的東西。如何使套接字通信?

public class Server{ 

    public static void main(String[] args) throws IOException, InterruptedException { 
     ServerSocket server = new ServerSocket(9999); 
     Socket socket = server.accept(); 
     PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 
     BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     String message = ""; 
     int ch = -1; 
     while((ch=in.read())!= -1){ 
      message+=ch; 
     } 
    // String message = in.readLine(); 
     System.out.println("RECEIVED "+message); 
     out.write("RESPONSE "+message+"\n"); 
     out.flush(); 

     System.out.println("NEW MESSAGE SEND"); 
     Thread.sleep(3000); 
     System.out.println("CLOSE"); 
     server.close(); 
    } 

} 

public class Client { 

    public static void main(String[] args) throws UnknownHostException, IOException { 
     Socket socket = new Socket("127.0.0.1", 9999); 
     PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 

     out.write("MESSAGE\n"); 
     out.flush(); 
     System.out.println("SEND MESSAGE"); 
     BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     System.out.println(in.readLine()); 
     socket.close(); 
    } 

} 

後運行此代碼,Client日誌"SEND MESSAGE"而服務器掛起in.read()並且不接收任何消息。 任何人都可以幫我解釋我做錯了什麼嗎?

+2

您是否按照[官方教程](https://docs.oracle.com/javase/tutorial/networking/sockets/clientServer.html)? –

+0

@ GermannArlington是的。否則,他無法在其周圍包裝「BufferedReader」。 – EJP

+0

@GermannArlington這是錯的。 'BufferedReader'不需要'InputStream'作爲參數。 –

回答

3

您的服務器正在從套接字讀取,直到流結束。流的結束僅在對等關閉連接時發生。此時您將無法發送回覆。你需要重新考慮你的協議。對於一個簡單的例子,你可以一次一個地讀和寫行,就像你在客戶端一樣。

+0

我接受你的答案,因爲它給了我提示,並且有些想法正在發生,但實際上使用方法'println'而不是'write'解決了我的問題。 – user902383

+0

實際上'write(「MESSAGE \ n」)'和'println(「MESSAGE」)'沒有區別,實際上你的問題是你一直在讀取輸入直到流結束而不是一行。 – EJP

+0

你是對的,我只是看着執行,也許我做了別的事,昨天已經太遲了。謝謝。 – user902383