2013-02-04 21 views
2

我目前正試圖編寫我的第一個客戶端>服務器系統,以通過網絡來回傳輸包含字符串的數據包。不過,我遇到了以下問題: 客戶端向服務器發送消息,服務器收到消息,處理消息,然後假設向客戶端發送回覆,但客戶端永遠不會收到此消息並掛起等待服務器的響應。下面是代碼:客戶端不會收到來自服務器的DataOutputStream的輸出

SERVER:

public static void handlePackets() throws Exception { 
    String clientSentence; 
    String returnToClient; 
    ServerSocket welcomeSocket = new ServerSocket(1337); 

     System.out.println("Packet receiver initialized!"); 
     while (run) { 
      Socket connectionSocket = welcomeSocket.accept(); 
      BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); 
      DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream()); 
      clientSentence = inFromClient.readLine(); 
      System.out.println("Received Packet: " + clientSentence); 


      System.out.println("Compiling return to client."); 
      returnToClient = ""; 
      if (clientSentence.startsWith("Handshake-")) { 
       returnToClient = handleHandShake(clientSentence); 
      } 

      outToClient.writeBytes(returnToClient); 
      System.out.println("Sent client response " + returnToClient); 
     } 
     welcomeSocket.close(); 
    } 

客戶:

public static String sendTCP(String host, String content) { 
    try { 
     System.out.println("Packet sender sending TCP packet " + content); 
     String serverResponse; 
     Socket clientSocket = new Socket(host, 1337); 
     DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream()); 
     BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 
     outToServer.writeBytes(content + '\n'); 

     System.out.println("Send data to sever. Awaiting response."); 

     serverResponse = inFromServer.readLine(); 
     clientSocket.close(); 

     System.out.println("Server response received " + serverResponse + " result was returned to caller."); 

     return serverResponse; 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 


    return ""; 
} 
+0

你有沒有試過在你的'DataOutputStream'上調用'flush()'?另外,爲什麼使用'DataOutputStream'呢?看起來這裏並沒有正確的課程。 – aroth

+0

@aroth flush()對'DataOutputStream'什麼都不做,除非在它下面有一個'BufferedOutputStream',在這種情況下並不存在。 – EJP

+0

@EJP當然這意味着它應該永遠不需要在'SocketOutputStream'上調用'flush()'? – aroth

回答

3

客戶端正在調用readLine()但服務器不寫一行,只是字節,所以客戶端正在永遠等待行終止符。追加'\ n'到服務器的回覆。服務器一旦完成,它應該關閉接受的套接字。通過關閉任何寫入器或輸出流來關閉它,而不是關閉套接字本身。您可以使用BufferedOutputStream而不是DataOutputStream。它可以用於簡單的數據,但如果您遲早不解決問題,則易於出現字符集問題。一般來說,您應該始終使用對稱的輸入和輸出流或讀取器。

+0

謝謝。這似乎工作。 –

0

1)你應該關閉或沖洗outToServer/outToClient

2)當你的BufferedReader讀你應該用BufferedWriter寫入,而不是DataOutputStream

相關問題