2014-01-23 71 views
0

我正在練習一個簡單的java程序,我正在演示簡單的客戶機服務器交互。來自服務器的消息的第一部分被傳送。然後程序繼續運行,不執行?我們是否需要爲每個單獨的流量創建一個新的套接字?客戶機/服務器編程

Server代碼

server = new ServerSocket(4587); 
System.out.print("Starting the Server on port " + server.getLocalPort() + "\n"); 
System.out.println("Waiting for client..."); 

Socket client = server.accept(); 
BufferedWriter br = new BufferedWriter(new OutputStreamWriter(client.getOutputStream())); 
BufferedReader br1 = new BufferedReader(new InputStreamReader(client.getInputStream())); 
br.write("Hello, you are connected to Server. What is your name?"); 
br.write("\n"); 
br.flush(); 



while((s=br1.readLine())!=null) 
    { 

    } 
    br.write("Thank you "); 
    br.newLine(); 
    br.flush(); 
    } 

客戶端代碼

String stdin; 
System.out.println("Attempting to connect to " + hostname + ":" + port); 
client = new Socket("localhost", 4587); 
System.out.println("Connection Established"); 

BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream())); 
while ((stdin = br.readLine()) != null) { 
    System.out.println(stdin); 
} 

BufferedWriter br1 = new BufferedWriter(new OutputStreamWriter(client.getOutputStream())); 
br1.write("Mike"); 
br1.write("\n"); 
br1.flush(); 

while ((stdin = br.readLine()) != null) { 
    System.out.println(stdin); 
} 

服務器輸出

Starting the Server on port4587 
Waiting for client.... 

客戶端輸出

Attempting to connect to :123 
Connection Established 
Hello you are connected to Server, What is ur name 

如果這可以幫助..在這兩個循環之後

+0

爲什麼向下票呢?他表現出了努力。 – bblincoe

+0

好吧,恕我直言,這個問題是以模糊的方式報道的,並且沒有明確提及代碼。 –

回答

0

您的服務器將首先通過accept方法與客戶端建立連接。如果您希望擁有多個客戶端,則需要相應地更改您的代碼以接受該客戶端。

在客戶端,您使用\n來描述消息的結尾。這將工作正常。每次發送新消息時,請使用\n來指示消息的結尾。

在服務器端,您應該繼續讀取I/O,直到看到\n。那時你已經收到了整個消息。處理它,然後再次開始收聽。

編輯:

既然你正在等待客戶端的名稱,你可以簡單地做服務器上執行以下操作:

BufferedWriter bout = new BufferedWriter(new OutputStreamWriter(client.getOutputStream())); 
BufferedReader bin = new BufferedReader(new InputStreamWriter(client.getInputStream())); 
// Wait for incoming name from client. 
String name = bin.readline(); 
System.out.println(name); 
// Send a reply. 
bout.write("Thank you\n"); 
bout.flush(); 

同樣,在客戶端上(假設binbout定義如上):

// Send name to server. 
bout.write("Name\n"); 
bout.flush(); 
// Get a response from the server and print to console. 
String response = bin.readline(); 
System.out.println(response); 
+0

像我應該使用while循環,同時從客戶端閱讀 – Koneri

+0

這是可以接受的 - 它只是取決於你想要達到的目標。在'while'循環中,您可以讀取每條消息並對其進行處理。完成之後,您將回到閱讀下一行。您可能需要考慮在單獨的線程中永遠監聽(在'while(true)'循環中),以便服務器除了一直監聽外還可以執行其他操作。 – bblincoe

+0

我編輯了我的服務器代碼。你可以看看它 – Koneri

0

這是因爲BufferedReader有一個def在讀取過程中,緩衝區= 8K,並且此過程是塊I/O,所以這將在該點處掛起。你應該從服務器端讀取來自客戶端的完整消息。

0

你的問題是在客戶端的循環。它會卡在循環中,因爲它等待服務器無限發送的讀取線。 (即,從服務器讀取第一行之後,它將期望來自服務器的更多行並等待讀取它們)。

要退出你需要發送的數據流信號的EOF信號或端,環(根據文檔:http://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html#readLine%28%29

+0

他發送了一個'\ n',這是他的EOF指標。 – bblincoe