2016-05-05 93 views
0

Hy,我試圖通過套接字發送兩個數字。服務器收回數字並進行一些計算,但當我將結果發送回客戶端時,客戶會收回他發送的數字。套接字Java - 客戶端收到錯誤信息

我在哪裏做錯了,因爲我不明白?

Client.java

public class Client { 
    private static Socket socket; 
    public static void main(String args[]) { 
     try { 
      String host = "localhost"; 
      int port = 25010; 
      InetAddress address = InetAddress.getByName(host); 
      socket = new Socket(address, port); 

      //Send the message to the server 
      OutputStream os = socket.getOutputStream(); 
      OutputStreamWriter osw = new OutputStreamWriter(os); 
      BufferedWriter bw = new BufferedWriter(osw); 

      String number = "2"; 
      String number2 = "5"; 

      String sendMessage = number + "\n"; 
      String sendMessage2 = number2 + "\n"; 
      bw.write(sendMessage); 
      bw.write(sendMessage2); 
      bw.flush(); 
      System.out.println("Message sent to the server:\n" + sendMessage + sendMessage2); 

      //Get the return message from the server 
      InputStream is = socket.getInputStream(); 
      InputStreamReader isr = new InputStreamReader(is); 
      BufferedReader br = new BufferedReader(isr); 
      String message = br.readLine(); 
      System.out.println("Message received from the server : " + message); 
     } catch (Exception exception) { 
      exception.printStackTrace(); 
     } finally { 
      //Closing the socket 
      try { 
       socket.close(); 
      } catch(Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

Server.java

public class Server { 
    private static Socket socket; 
    public static void main(String[] args) { 
     try { 
      int port = 25010; 
      ServerSocket serverSocket = new ServerSocket(port); 
      System.out.println("Server Started and listening to the port " + port); 
      ArrayList<String> arr = new ArrayList<String>(); 

      //Server is running always. This is done using this while(true) loop 
      while(true) { 
       //Reading the message from the client 
       socket = serverSocket.accept(); 
       BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));  // primeste mesaj de la client 
       BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); // transmite raspuns catre client 
       PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 

       String inputLine; 
       while ((inputLine = br.readLine()) != null) { 
        out.println(inputLine); 
        arr.add(inputLine.trim()); 
       } 

       System.out.println("Message received from client is:"); 
       for (int i = 0; i < arr.size(); i++) { 
        System.out.println(arr.get(i)); 
       } 

       //Return message 
       String returnMessage = null; 
       try { 
        int numberInIntFormat = 0; 
        int num = 1; 
        for (int i = 0; i < arr.size(); i++) { 
         System.out.println(arr.get(i)); 
         numberInIntFormat = Integer.parseInt(arr.get(i)); 
         num = num * numberInIntFormat; 
        } 
        arr.clear(); 
        returnMessage = String.valueOf(num); 
       } catch(NumberFormatException e) { 
        //Input was not a number. Sending proper message back to client. 
        returnMessage = "Please send a proper number\n"; 
       } 

       //Sending the response back to the client. 
       bw.write(returnMessage); 
       bw.flush(); 
       System.out.println("returnMessage = " + returnMessage); 
       System.out.println("Message sent to the client is "+ returnMessage); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       socket.close(); 
      } catch(Exception e) {} 
     } 
    } 
} 
+1

發佈您的控制檯輸出。 – shmosel

+0

我現在發佈:) – Doro

回答

-1

我發現了一個更好的方法:

while (br.ready() && (inputLine = br.readLine()) != null) 

這告訴大家,閱讀如果緩衝區這是要讀的東西。

由於@John Bollinger的迴應,緩衝區只能讀取第一個換行符,所以如果您嘗試解析包含換行符的字符串,您將在出現換行符時跳出。

使用br.ready()它將解析所有的字符串並在緩衝區結束時退出。

+0

當沒有可用的數據可被讀取而沒有阻塞時,它將退出循環。這很少是你想要的。 – EJP

0

您的服務器的代碼相呼應,一切從客戶端讀取回它任何其他與它之前的客戶端:

BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));  // primeste mesaj de la client 
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); // transmite raspuns catre client 
    PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 

    String inputLine; 
    while ((inputLine = br.readLine()) != null) { 
     out.println(inputLine); // <-- HERE 
     arr.add(inputLine.trim()); 
    } 

客戶端收到服務器發送的內容並不令人驚訝。

+0

我擦了你告訴我的那一行,現在服務器不發回任何消息......我在等,我在等待... – Doro

+0

@Doro還有其他錯誤。 – granmirupa

+0

那麼,那將是因爲服務器無法知道客戶端已完成發送輸入。 'BufferedReader.readLine()'在文件結束時返回'null',但是在連接關閉之前,網絡連接上沒有達到文件結束。 –

0
String inputLine; 
while ((inputLine = br.readLine()) != null) { 
    arr.add(inputLine.trim()); 
} 

隨着這一變化,輸出爲:

服務器:

Server Started and listening to the port 25010 

客戶:

Message sent to the server: 
2 
5 

現在服務器處於 '封鎖' while循環和客戶端不reci有任何反饋。

0

試試這個:

客戶:

public class Client { 
    private static Socket socket; 
    public static void main(String args[]) { 
     try { 
      String host = "localhost"; 
      int port = 25010; 
      InetAddress address = InetAddress.getByName(host); 
      socket = new Socket(address, port); 

      //Send the message to the server 
      OutputStream os = socket.getOutputStream(); 
      OutputStreamWriter osw = new OutputStreamWriter(os); 
      BufferedWriter bw = new BufferedWriter(osw); 

      String number = "2"; 
      String number2 = "5"; 

      String sendMessage = number + "\n"; 
      String sendMessage2 = number2 + "\n"; 
      bw.write(sendMessage); 
      bw.write(sendMessage2); 
      bw.newLine(); // You need to send a special line for say to the server: "Hey, I have done"; 
      bw.flush(); 
      System.out.println("Message sent to the server:\n" + sendMessage + sendMessage2); 

      //Get the return message from the server 
      InputStream is = socket.getInputStream(); 
      InputStreamReader isr = new InputStreamReader(is); 
      BufferedReader br = new BufferedReader(isr); 
      String message = br.readLine(); 
      System.out.println("Message received from the server : " + message); 
     } catch (Exception exception) { 
      exception.printStackTrace(); 
     } finally { 
      //Closing the socket 
      try { 
       socket.close(); 
      } catch(Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

服務器:

public class Server { 
    private static Socket socket; 
    public static void main(String[] args) { 
     try { 
      int port = 25010; 
      ServerSocket serverSocket = new ServerSocket(port); 
      System.out.println("Server Started and listening to the port " + port); 
      ArrayList<String> arr = new ArrayList<String>(); 

      //Server is running always. This is done using this while(true) loop 
      while(true) { 
       //Reading the message from the client 
       socket = serverSocket.accept(); 
       BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));  // primeste mesaj de la client 
       BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); // transmite raspuns catre client 
       PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 

       String inputLine; 
       while ((inputLine = br.readLine()) != null && inputLine.length() > 0) { // You need to stop loop when you get empty line 
        // out.println(inputLine); 
        arr.add(inputLine.trim()); 
        System.out.println("Message received from client is:"+inputLine.trim()); 
       } 

       System.out.println("Message received from client is:"); 

       //Return message 
       String returnMessage = null; 
       try { 
        int numberInIntFormat = 0; 
        int num = 1; 
        for (int i = 0; i < arr.size(); i++) { 
         System.out.println(arr.get(i)); 
         numberInIntFormat = Integer.parseInt(arr.get(i)); 
         num = num * numberInIntFormat; 
        } 
        arr.clear(); 
        returnMessage = String.valueOf(num); 
       } catch(NumberFormatException e) { 
        //Input was not a number. Sending proper message back to client. 
        returnMessage = "Please send a proper number\n"; 
       } 

       //Sending the response back to the client. 
       bw.write(returnMessage+"\n"); // You need to add '\n' otherwise readLine never gets; 
       bw.flush(); 
       System.out.println("returnMessage = " + returnMessage); 
       System.out.println("Message sent to the client is "+ returnMessage); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       socket.close(); 
      } catch(Exception e) {} 
     } 
    } 
} 
+0

非常感謝。它的工作原理:D – Doro

+0

爲了讓這是一個有用的答案(對於社區),你需要解釋你已經改變了什麼,以及爲什麼。 –

+0

@JohnBollinger我做到了。進入代碼我添加了一些意見 – granmirupa