2017-06-03 65 views
0

客戶端發送一條消息,然後服務器收到消息並回復消息。我不知道客戶爲什麼不能閱讀迴應。如果我刪除客戶端中的讀取部分,服務器可以獲取消息。但對於下面的代碼,沒有任何工作。另外我嘗試了flush(),它仍然不起作用。Java套接字可以讓客戶端無法讀取數據

對於客戶

public void run() { 

    try (Socket echoSocket = new Socket(HOSTNAME, Integer.parseInt(PORTNUMBER)); 
      DataOutputStream dOut = new DataOutputStream(echoSocket.getOutputStream()); 
      DataInputStream dIn = new DataInputStream(echoSocket.getInputStream()); 
    ) { 

     while (true) { 


      command = UI.commandQueue.take() 
      dOut.writeInt(Message.toByteArray(command).length); 
      dOut.write(Message.toByteArray(command)); 


      int length; 
      while((length = dIn.readInt()) != 0) { 
      if (length > 0){ 
       byte[] messagebyte = new byte[length]; 
       dIn.readFully(messagebyte, 0, messagebyte.length); 
       try { 
        msg = Message.fromByteArray(messagebyte); 
        testDisplay(msg); 
       } catch (Exception e1) { 
        // TODO Auto-generated catch block 
        e1.printStackTrace(); 
       } 
       testDisplay(msg); 
      } 
      } 


     } 

    }catch (UnknownHostException e) { 
     UI.display("Don't know about host " + HOSTNAME); 
    } catch (IOException e) { 
     UI.display("Couldn't get I/O for the connection to " + HOSTNAME); 
    } 
} 

對於服務器

public void run() { 

    try (ServerSocket serverSocket = new ServerSocket(Integer.parseInt(PORT_NUMBER)); 
      Socket clientSocket = serverSocket.accept(); 

      DataOutputStream dOut = new DataOutputStream(clientSocket.getOutputStream()); 
      DataInputStream dIn = new DataInputStream(clientSocket.getInputStream());) { 
     int length; 
     while ((length = dIn.readInt()) != 0) { 
      if (length > 0) { 
       byte[] messagebyte = new byte[length]; 
       dIn.readFully(messagebyte, 0, messagebyte.length); // read the 
                   // message 
       Message msg; 
       try { 
        msg = Message.fromByteArray(messagebyte); 
        testDisplay(msg); 
        dOut.writeInt(Message.toByteArray(msg).length); 
        dOut.write(Message.toByteArray(msg)); 
        UI.display("ack sent"); 
       } catch (Exception e) { 
        // TODO Auto-generated catch block 
        UI.display(e.getMessage()); 
       } 

      } 
      } 
    } catch (IOException e) { 
     UI.display(
       "Exception caught when trying to listen on port " + PORT_NUMBER + " or listening for a connection"); 
     UI.display(e.getMessage()); 
    } 

} 
+0

你是否需要你的服務器來連續接收和發送來自多個客戶端的數據?我可以在你的代碼中看到很多錯誤,我有一個解決方案給你,但需要首先得到你的反饋。 –

回答

0

您的服務器呼應每個請求一個響應,但您的客戶端試圖讀取每個請求多個響應,它永遠不會,所以它阻止。

相關問題