2012-11-13 43 views
3

我正在用客戶端和服務器編寫一個小程序。服務器程序包含計算器程序。當服務器和客戶端運行時,客戶端可以輸入並等於例如。 2 + 2,服務器將計算它並將答案發送給客戶端。程序也應該包含一個幫助選項,所以當命令幫助從客戶端發送到服務器時,服務器應該返回一個幫助菜單。 我的問題是,它返回的幫助菜單,但在一行中,它不是打印出來的控制檯在單獨的行。謝謝你的幫助。JAVA客戶端服務器用新行讀取字符串

服務器代碼:

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(); 

    } 

} 

回答

1

您必須添加圍繞在客戶端的ReadLine方法while循環:

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

,還優選使用常數代替對其進行硬編碼:System.getProperty("line.separator");

+0

這適用於在控制檯上打印菜單,但它只會在一次和以後工作,我無法發送任何其他命令到服務器。 – Saint

+0

您沒有關閉服務器上的套接字。 –

+0

如果關閉套接字ss我會關閉服務器。 – Saint

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"; 
+0

嘗試過,不起作用僅打印出第一行,並且沒有打印出以後的內容。 – Saint

+0

這是因爲在您的客戶端代碼中,您只調用一次br.readLine();這只是讀取第一行。您應該多次調用它來閱讀後續行。可能會在一些循環中。 –

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(); 

} 
+0

或'StringBuffer' ... :) –

+0

@ShashankKadne ..是的,StringBuffer也可以。 –

+0

我試圖使用StringBuilder,但問題是它只會打印出第一行,這就是全部。 – Saint

相關問題