2015-09-05 117 views
0

我們獲得了實現客戶端/服務器項目的網絡分配。我們給出的一個例子是一個客戶端/服務器計算器程序。我已經發布了以下兩個類的代碼。我正在使用eclipse,並在我的運行配置設置中輸入'ADD,5,6'作爲客戶端程序的參數,但輸出爲空。你們能看到爲什麼會發生這種情況嗎?JAVA客戶端/服務器計算器示例

客戶端代碼:

package networking; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.Socket; 
import java.net.UnknownHostException; 

public class CalculatorClient { 

    /** 
    * @param args 
    * @throws IOException 
    * @throws UnknownHostException 
    */ 
    public static void main(String[] args) throws UnknownHostException, IOException { 
     String operation = args[0]; 

     // Create a new socket object and names it socket 
     // the constructor requires the name of the computer and the port number to which you want to connect 
     Socket socket = new Socket("localhost", CalculatorServer.PORT_NO); 

     // gets the socket's input stream and opens a BufferedReader on it. 
     BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 

     // gets the socket's output stream and opens a PrintWriter on it 
     PrintWriter pw = new PrintWriter(socket.getOutputStream()); 

     pw.println(operation); 
     pw.flush(); 

     if (!"quit".equals(operation.trim())) { 
      String line = reader.readLine(); 
      reader.close(); 
      System.out.println("Line 36 in Client"); 
      System.out.println("result: " + line); 
      System.out.println("Line 38 in Client"); 
     } 
     socket.close(); 


    } 

} 

Server代碼:

package networking; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.ServerSocket; 
import java.net.Socket; 

/** 
* Support add, subtraction, multiplication, division 
* @author hluu 
* 
*/ 
public class CalculatorServer { 
    enum OPERATOR { ADD, SUB, MULT, DIV }; 

    public static final int PORT_NO = 8888; 

    /** 
    * @param args 
    * @throws IOException 
    * @throws InterruptedException 
    */ 
    public static void main(String[] args) throws IOException, InterruptedException { 

     ServerSocket serverSocket = new ServerSocket(PORT_NO); 
     System.out.println("... server is accepting request"); 

     while (true) { 
      Socket socket = serverSocket.accept(); 

      BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      String line = reader.readLine(); 

      System.out.println("got request: " + line); 
      System.out.println("Right after getting request"); 

      if (line.trim().startsWith("quit")) { 
       System.out.println("... server shutting down ..."); 
       socket.close(); 
       break; 
      } else { 
       System.out.println("Entering Else"); 
       System.out.println(line); 
       processRequest(socket, line); 
      } 
     } 

     System.out.println("... closing server socket ..."); 
     serverSocket.close(); 
    } 

    private static void processRequest(Socket socket, String line) throws IOException, InterruptedException { 
     PrintWriter pw = new PrintWriter(socket.getOutputStream()); 

     String[] tokens = line.split(" "); 

     if (tokens.length != 2) { 
      pw.println("invalid command: " + line); 
      socket.close(); 
      return; 
     } 

     String[] operands = tokens[1].split(","); 

     if (operands.length != 2) { 
      pw.println("invalid command: " + line); 
      socket.close(); 
      return; 
     } 

     String operator = tokens[0].trim(); 

     try { 
      Double operand1 = Double.valueOf(operands[0].trim()); 
      Double operand2 = Double.valueOf(operands[1].trim()); 
      System.out.println(operand1);System.out.println(operand2); 

      double result = 0; 
      OPERATOR op = OPERATOR.valueOf(operator.toUpperCase()); 
      switch (op) { 
      case ADD: 
       result = operand1 + operand2; 
       break; 
      case SUB: 
       System.out.println("Entering SUB"); 
       result = operand1 - operand2; 
       break; 
      case MULT: 
       result = operand1 * operand2; 
       break; 
      case DIV: 
       result = operand1/operand2; 
       break; 
      default: 
       pw.println("invalid operand: " + line); 
       pw.flush(); 
       socket.close(); 
       return; 
      } 

      System.out.println("send back result: " + result); 
      pw.println(result); 
     } catch (NumberFormatException nfe) { 
      pw.println("invalid operand: " + line); 
     } 

     pw.flush(); 
     socket.close(); 
    } 

} 
+0

基於給定的代碼(更具體的'分裂(」「)''中processRequest'),你應該調用你的客戶'ADD 5,6'代替'ADD,5,6'。 – Tunaki

+0

你好,我也試過了。我也嘗試了「添加5 6」,「添加5,6」,「添加5 6」。他們似乎都沒有工作。 – DeeTee

回答

2

調試是在大多數情況下的方式,看看發生了什麼。 因爲它出來你的觀點的權利的格式是:

ADD 5,6

operation串在你CalculatorClient爭奪只有ADD一部分args內容居然是:{"ADD", "5,6"}。因此,要形成有效的請求,你應該Concat的你輸入像一些方法:

String operation = args[0] + " " + args[1];