2017-11-01 2 views
0

JavaでI/Oを学びたいと思っていますが、この問題に長年悩まされていました....私のサーバー側を実行した後、私はクライアント側を実行します。問題は、両方の数値を入力すると、サーバーから値が返されず、ループを実行して値を入力できるようになることです。デバッグしてどのような接続が無効であるかを調べる方法がわかりません。基本I/Oプログラム

public class Client { 

    public static void main(String[] args) throws Exception { 

     Socket soc = new Socket("localhost", 9806); 

     BufferedReader userInput = new BufferedReader(new InputStreamReader((System.in))); 

     BufferedReader in = new BufferedReader(new InputStreamReader((soc.getInputStream()))); 

     PrintWriter out = new PrintWriter(soc.getOutputStream(), true); 

     int option = 0; 
     int num1 = 0; 
     int num2 = 0; 

     do { 
      System.out.println("Choose an operation"); 
      System.out.println("1 Addion"); 
      System.out.println("2 Subtraction"); 
      System.out.println("3 Multiplication"); 
      System.out.println("4 Division"); 
      System.out.println("Enter an option"); 
      option = Integer.parseInt(userInput.readLine()); 

      System.out.println("Enter number"); 
      num1 = Integer.parseInt(userInput.readLine()); 

      System.out.println("Enter number"); 
      num2 = Integer.parseInt(userInput.readLine()); 

      out.println(option + ":" + num1 + ":" + num2); 

      String answer = in.readLine(); 
      System.out.println("Server says: " + answer); 
     } while(true); 
    } 
} 

サーバー側:

public class Server { 

    public static void main(String[] args) throws Exception { 

     ServerSocket ss = new ServerSocket(9806); 
     System.out.println("Waiting for client"); 

     Socket soc = ss.accept(); 

     System.out.println("Connection established"); 

     BufferedReader in = new BufferedReader(new InputStreamReader(soc.getInputStream())); 

     PrintWriter out = new PrintWriter(soc.getOutputStream(), true); 

     while(true){ 
      String str[] = in.readLine().split(":"); 

      int option = Integer.parseInt(str[0]); 
      int num1 = Integer.parseInt(str[1]); 
      int num2 = Integer.parseInt(str[2]); 
      String result = ""; 

      switch(option) { 
       case 1: result = "Addition is: " + (num1 + num2);break; 
       case 2: result = "Subtraction is: " + (num1 - num2);break; 
       case 3: result = "Multiplication is: " + (num1 * num2);break; 
       case 4: result = "Division is: " + (num1/num2);break; 
       default: break; 
      } 
      out.print(result); 

     } 
    } 
} 

ありがとうございました!

+3

タイプミス:

は、このコードを参照してください。 'println'で自動塗りつぶしを認識しているようですが、' out.println(result);の代わりに 'out.print(result);'を使った 'Server'クラスでは、フラッシングはありませんでした。 – Pshemo

+0

クライアントのin.readLine()でブロックされているようです。 –

+0

あなたはPshemoを高速化していました。 Out.printをout.printlnに修正すると正しいです。 –

答えて

0

あなたは、 `自動フラッシュ用のサーバーに

printlnを使用していない、あなたは

入力ストリームとwhileを悪用し、AutoCloseableインタフェースを活用するためにtry-with-resourceを使用しようとしています。

Serverクラス

public class Server { 

    public static void main(String[] args) { 
     System.out.println("Waiting for client"); 

     try (ServerSocket serverSocket = new ServerSocket(9806); 
       Socket socket = serverSocket.accept(); 
       BufferedReader socketInputReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
       PrintWriter socketOutputWriter = new PrintWriter(socket.getOutputStream(), true);) { 

      System.out.println("Connection established"); 

      String line; 

      while ((line = socketInputReader.readLine()) != null) { 
       String str[] = line.split(":"); 

       int operation = Integer.parseInt(str[0]); 
       int num1 = Integer.parseInt(str[1]); 
       int num2 = Integer.parseInt(str[2]); 
       String result = ""; 

       switch (operation) { 
       case 1: 
        result = "Addition is: " + (num1 + num2); 
        break; 
       case 2: 
        result = "Subtraction is: " + (num1 - num2); 
        break; 
       case 3: 
        result = "Multiplication is: " + (num1 * num2); 
        break; 
       case 4: 
        result = "Division is: " + (num1/num2); 
        break; 
       default: 
        break; 
       } 
       socketOutputWriter.println(result); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Clientクラス

public class Client { 

    public static void main(String[] args) { 

     try (Socket socket = new Socket("localhost", 9806); 
       BufferedReader userInput = new BufferedReader(new InputStreamReader((System.in))); 
       BufferedReader socketInputReader = new BufferedReader(new InputStreamReader((socket.getInputStream()))); 
       PrintWriter socketOutputWriter = new PrintWriter(socket.getOutputStream(), true);) { 

      String answer; 

      while (true) { 
       System.out.println("Choose an operation"); 
       System.out.println("1 Addion"); 
       System.out.println("2 Subtraction"); 
       System.out.println("3 Multiplication"); 
       System.out.println("4 Division"); 
       System.out.println("Enter an option"); 
       int operation = Integer.parseInt(userInput.readLine()); 

       System.out.println("Enter number"); 
       int num1 = Integer.parseInt(userInput.readLine()); 

       System.out.println("Enter number"); 
       int num2 = Integer.parseInt(userInput.readLine()); 

       socketOutputWriter.println(operation + ":" + num1 + ":" + num2); 

       while ((answer = socketInputReader.readLine()) != null) { 
        System.out.println("Server says: " + answer); 
        System.out.println(); 
        break; 
       } 
      } 
     } catch (UnknownHostException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
関連する問題