2016-05-05 9 views
0

Hy、ソケット経由で2つの数値を送信しようとしています。サーバーは数値を受け取り、何らかの計算を行いますが、結果をClientに返すと、クライアントはその数値を受け取ります。ソケットJava - クライアントが間違った情報を受け取ります

私は間違ったbeceause私は理解していないのですか?

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

私はより良い方法を見つけましたそれは何か読んでいる。

@John Bollingerの応答では、バッファは最初の改行までしか読み込まれないため、改行を含む文字列を解析しようとすると、改行が現れると消えてしまいます。

br.ready()は、すべてのStringを解析し、バッファの最後に出ます。

+0

No.ブロックせずに読み込めるデータがない場合、ループを終了します。これはめったにあなたが望むものではありません。 – 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 

そして今Serverはに 'ブロックされた' は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(); 
      } 
     } 
    } 
} 

はサーバー:

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

場合、これは、バッファを読むためにそれを伝える:

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

@ジョンボールリンガー私はしました。コードに私はいくつかのコメントを追加しました – granmirupa

関連する問題