4

私はクライアントとサーバーで小さなプログラムを書いています。サーバープログラムには、電卓プログラムが含まれています。サーバーとクライアントが実行されている間、クライアントは入力と方程式を実行できます。2 + 2とサーバーはそれを計算し、クライアントに回答を送信します。プログラムにはヘルプオプションも含まれている必要があるため、コマンドhelpがクライアントからサーバーに送信されると、サーバーはヘルプメニューを返す必要があります。私の問題は、ヘルプメニューが返されることですが、すべて1行で、コンソールに別々の行で出力されません。助けてくれてありがとう。

サーバーコード:

package One;

    import java.io.*;
    import java.net.*;


    public class ServerCalculator {

        static double answer;

        public ServerCalculator(){

            System.out.println("Server...");

            theServer();

            }
        void theServer(){

            try{

                ServerSocket ss = new ServerSocket(9990);
                while(true){

                    Socket sc = ss.accept();
                    Help hp = new Help();
                    BufferedReader br = new BufferedReader(new InputStreamReader(sc.getInputStream()));
                    String compute = br.readLine();

                    Maths(compute);
                    PrintWriter pw = new PrintWriter(sc.getOutputStream());

                    if(compute.equals("help")){
    //                  pw.println(hp.noOfLines());
                        pw.println(hp.menu());
                    }

                    if(compute.equals("exit")){
                        ss.close();
                    }

                    else{
                        pw.println(answer); 
                    }

                    pw.flush();
                }

            }

            catch (Exception ee){
                ee.printStackTrace();
            }

        }

        static double Maths(String compute){

          String message[] = compute.split(" ");


          if(message[0].equalsIgnoreCase("Help"))
          {
              return -2;
          }

          if(message[0].equalsIgnoreCase("Exit"))
          {
              return -1;
          }


          double rad = 0;

          double a = Integer.parseInt(message[0]);
          double b = Integer.parseInt(message[2]);

          if(message[1].equalsIgnoreCase("Sin")){
                rad = Math.toRadians(a);
                answer = Math.sin(rad);
            }
            if(message[1].equalsIgnoreCase("Cos")){
                if(a==90 || a==270){
                    answer = 0;
                }
                else{
                    rad = Math.toRadians(a);
                    answer = Math.cos(rad);
                }
            }
            if(message[1].equalsIgnoreCase("Tan")){
                if(a==90 || a==270){
                    System.out.println("Invalid Calculation");
                    answer =  0;
                }
                else if(a==45 || a==135){
                    rad = Math.toRadians(a);
                    answer = Math.tan(rad);
                }
                rad = Math.toRadians(a);
                answer = Math.tan(rad);
            }
        if(message[1].equalsIgnoreCase("Power") || (message[1].equalsIgnoreCase("^")))
        {
            answer = Math.pow(a, b);  
        }

          if(message[1].equalsIgnoreCase("Multiply") || (message[1].equalsIgnoreCase("*")))
          {
              answer = a*b;  
          }
          if(message[1].equalsIgnoreCase("Add") || (message[1].equalsIgnoreCase("+")))
          {
            answer = a+b;
          }
          if(message[1].equalsIgnoreCase("Subtract") || (message[1].equalsIgnoreCase("-")))
          {
            answer = a-b;
          }
          if(message[1].equalsIgnoreCase("Divide") || (message[1].equalsIgnoreCase("/")))
          {
            answer = a/b;
          }
            return answer;

      }


    }

クライアントコード:

package One;

import java.net.*;
import java.util.Scanner;
import java.io.*;

    public class ClientCalculator {


        public static void main(String[] args) {

            Socket sc;  

            System.out.println("Client...");

            while(true){

                try
                {
                    Scanner sin = new  Scanner(System.in);
                    String question = sin.nextLine(); 
                    System.out.println("Processing: " + question);


                    sc = new Socket("localhost",9990);

                    PrintWriter pw = new PrintWriter(sc.getOutputStream());

                    pw.println(question);   
                    pw.flush();

                    BufferedReader br = new BufferedReader(new InputStreamReader(sc.getInputStream()));
                    String answer = br.readLine();
                    System.out.println(question + " = " + answer);
//                  sc.close();
//                  sin.close();
                }

                catch(Exception ee){

                }
            }
     }



    }

ヘルプメニュー:

package One;

public class Help {

String menu(){

    String helpMenu = 
    "Instructions for the calculator " +
    "Input the number followed by space and then by word or operator and by number to get result " +
    "e.g. 5 + 5. or 30 Sin 30 - where 30 is the angle. " + 
    "Options are " + 
    "Multiply or (*) " + 
    "Add or (+) " +  
    "Subtract or (-) " + 
    "Divide or (/) " + 
    "Sin, Cos, Tan ";

    return helpMenu;

}


//  String noOfLines() {
//      
//      return "9";
//  }

}

実行コード:

package One;

public class TestClass {

    public static void main(String[] args) {

        new ServerCalculator();

    }

}
4

3 に答える 3

2

改行を挿入するには、「\n」文字を使用します。

交換

String helpMenu = 
    "Instructions for the calculator " +
    "Input the number followed by space and then by word or operator and by number to get result " +
    "e.g. 5 + 5. or 30 Sin 30 - where 30 is the angle. " + 
    "Options are " + 
    "Multiply or (*) " + 
    "Add or (+) " +  
    "Subtract or (-) " + 
    "Divide or (/) " + 
    "Sin, Cos, Tan ";

String helpMenu = 
    "Instructions for the calculator\n" +
    "Input the number followed by space and then by word or operator and by number to get result\n" +
    "e.g. 5 + 5. or 30 Sin 30 - where 30 is the angle. \n" + 
    "Options are \n" + 
    "Multiply or (*) \n" + 
    "Add or (+)\n " +  
    "Subtract or (-) \n" + 
    "Divide or (/) \n" + 
    "Sin, Cos, Tan \n";
于 2012-11-13T17:32:27.240 に答える
2

それはあなたがそれらを一行で送っているからです。newline (\n)異なる行に表示するには、各行の後にを追加する必要があります。

また、注意:-StringBuilder文字列の連結を多用する場合は、を使用することをお勧めします。

メニュー方法を次のように変更できます。

String menu(){
    StringBuilder helpMenu = new StringBuilder();

    helpMenu.append("Instructions for the calculator \n")
            .append("Input the number followed by space and then by word or operator and by number to get result \n")
            .append("e.g. 5 + 5. or 30 Sin 30 - where 30 is the angle. \n")
            .append("Options are: \n")
            .append("\tMultiply or (*) \n")
            .append("\tAdd or (+) \n")
            .append("\tSubtract or (-) \n")
            .append("\tDivide or (/) \n")
            .append("\tSin, Cos, Tan \n");

    return helpMenu.toString();

}
于 2012-11-13T17:33:18.453 に答える
2

クライアントのreadlineメソッドの周りにwhileループを追加する必要があります。

String answer = null;
while((answer=br.readLine()) != null)
{
//print answer
}

ハードコーディングする代わりに定数を使用することもお勧めします。System.getProperty("line.separator");

于 2012-11-13T17:43:48.053 に答える