2016-05-02 96 views
0

我無法將信息從客戶端發送到服務器。 輸出應該是:Java中的TCP服務器

*服務器:*
$>的Java的TcpClient /服務器IP/8080
用戶當前客戶端的ID:岩石//應該打印出來,但它沒有
。 ..

客戶
$>的Java TCPSERVER 8080
類型登錄開始
登錄 //用戶輸入
FROM SERVER:請使用您的用戶名登錄。
岩石 //用戶輸入
發送到服務器:岩石
...

但是服務器不打印出來的語句,它有需要緩衝或流做清潔向上?代碼包含在下面。

TCPSERVER代碼:

... 
BufferedReader inFromClient = new BufferedReader(
      new InputStreamReader(connectionSocket.getInputStream())); 
DataOutputStream outToClient = 
      new DataOutputStream(connectionSocket.getOutputStream()); 
... 
outToClient.writeBytes("Please log in with your user ID.\n"); 
String clientId = inFromClient.readLine() 
System.out.println("User ID of the current client: " + clientId); 
outToClient.writeBytes("Game has started!\n"); 

的TcpClient代碼:

... 
    DataOutputStream outToServer = 
      new DataOutputStream(clientSocket.getOutputStream()); 
    BufferedReader inFromServer = new BufferedReader(
      new InputStreamReader(clientSocket.getInputStream())); 
    ... 
    System.out.println("Type login to start"); 
    if ((inFromUser.readLine()).equals(login)) 
    { 
      System.out.println("FROM SERVER: " + inFromServer.readLine()); 
      String option = inFromUser.readLine(); 
      outToServer.writeBytes(option); 
      System.out.println("Sent to Server: "+ option); 
      //should print "FROM SERVER: Game has started!" 
      System.out.println("FROM SERVER: " + inFromServer.readLine()); 
    } 
    ... 
+0

你試過'OutputStream.flush()'嗎? –

+0

添加調試以查看發生了什麼。什麼'inFromUser.readLine()'返回,如果有的話? –

+1

每個'readLine()'結果都需要先檢查爲null,然後再執行其他任何操作。 – EJP

回答

1

你混合了字符流和字節流。一個DataOutputStream通常用於發送非字符數據。沒有字段分隔符或行結束符,因爲輸入不應該是自由格式。一個整數將只發送4個字節,而不是\x0030\x0039之間的可變字符數。相反,BufferedReader用於面向行的字符數據。字符使用Charset編碼,例如ASCIIUTF-16。取決於平臺,行終止於\n\r\n

對於你看起來像你試圖做的事情,應該使用PrintStream而不是DataOutputStream。 EG)爲outToServer

PrintStream outToClient = new PrintStream(connectionSocket.getOutputStream(), true); 
    outToClient.println("Please log in with your user ID."); 

使用類似的代碼。

注意:傳遞給PrintStream構造函數的值true可以在發送換行符時自動刷新,因此大多數#flush()調用變得不必要。


編輯

爲了對稱,因爲你正在使用BufferedReader,我應該說使用PrintWriter。代替;以完全相同的方式使用:

PrintWriter outToClient = new PrintWriter(connectionSocket.getOutputStream(), true); 
outToClient.println("Please log in with your user ID."); 

最後一點:既PrintStreamPrintWriter抑制所有IOException秒。您應該定期使用#checkError()以確保未發生異常,例如流關閉。