2013-04-21 55 views
-1

我試圖創建一個客戶機/服務器應用程序,服務器要求客戶寫兩個操作數,然後選擇一個操作時,客戶機選擇服務器發回他的結果的操作。NumberFormatException的在Double.parseDouble()

當我想運行我的節目,我得到這個錯誤:

Exception in thread "main" java.lang.NumberFormatException: For input string: "1lient connectée" 
    at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1241) 
    at java.lang.Double.parseDouble(Double.java:540) 
    at Server.main(Server.java:29) 

這是我的代碼:

* 服務器:*

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


public class Server { 

    public static void main (String[] args){ 
     try{ 
      DatagramSocket s = new DatagramSocket(1234); 
      byte[] sendBuffer = new byte [1024]; 
      byte[] recvBuffer = new byte[1024]; 
      DatagramPacket sendPacket, recvPacket; 
      String reply = null; 

      //Get the connection declaration from client 
      recvPacket = new DatagramPacket(recvBuffer, recvBuffer.length); 
      s.receive(recvPacket); 
      System.out.println(new String(recvPacket.getData())); 


      //Send the first message to client to write the first operand 
      sendBuffer = "Entré n1 : ".getBytes(); 
      sendPacket = new DatagramPacket(sendBuffer,sendBuffer.length,recvPacket.getAddress(),recvPacket.getPort()); 
      s.send(sendPacket); 

      //Get the first operand 
      recvPacket = new DatagramPacket(recvBuffer, recvBuffer.length); 
      s.receive(recvPacket); 
      double n1 = Double.parseDouble(new String(recvPacket.getData())); 

      //Send the second message to client to write the second operand 
      sendBuffer = "Donner n2 : ".getBytes(); 
      sendPacket = new DatagramPacket(sendBuffer, sendBuffer.length, recvPacket.getAddress(), recvPacket.getPort()); 
      s.send(sendPacket); 

      //Get the second operand 
      recvPacket = new DatagramPacket(recvBuffer, recvBuffer.length); 
      s.receive(recvPacket); 
      double n2 = Double.parseDouble(new String(recvPacket.getData())); 

      //Send the third message to client to choose the operation 
      sendBuffer = "Choisir l'op : \n1-Addition \n2-Soustraction \n3-Multiplication \n4-Division \nVotre choix : ".getBytes(); 
      sendPacket= new DatagramPacket(sendBuffer, sendBuffer.length, recvPacket.getAddress(), recvPacket.getPort()); 
      s.send(sendPacket); 

      //Get the number of operation 
      recvPacket = new DatagramPacket(recvBuffer, recvBuffer.length); 
      s.receive(recvPacket); 
      reply = new String(recvPacket.getData()); 

      //Traitement 
      String res = null; 
      switch(reply){ 
        case "1" : 
         res = String.valueOf(n1 + n2); 
         break; 
        case "2" : 
         res = String.valueOf(n1 - n2); 
         break; 
        case "3" : 
         res = String.valueOf(n1*n2); 
        case "4" : 
         res = (n2 == 0) ? "Division sue zéro" : String.valueOf(n1/n2); 
         break; 
        default : 
         res = "Erreur"; 
      }  

      //Send the result of the operation to the client 
      sendBuffer = ("Resultat : "+res).getBytes(); 
      sendPacket = new DatagramPacket(sendBuffer, sendBuffer.length, recvPacket.getAddress(), recvPacket.getPort()); 
      s.send(sendPacket); 

     }catch(IOException e){ 
      e.printStackTrace(); 
     } 
    } 

} 

客戶:

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


public class Client { 

    public static void main (String[] args) throws UnknownHostException{ 
     DatagramSocket s; 
     byte[] sendBuffer = new byte[1024]; 
     byte[] recvBuffer = new byte[1024]; 
     DatagramPacket sendPacket, recvPacket; 
     String reply = null; 
     final InetAddress ADRSS = InetAddress.getByName("localhost"); 
     final int PORT = 1234; 
     Scanner cn = new Scanner(System.in); 
     try{ 
      s = new DatagramSocket(); 

      //Declare connection to server 
      sendBuffer = "Client connectée".getBytes(); 
      sendPacket = new DatagramPacket(sendBuffer, sendBuffer.length, ADRSS, PORT); 
      s.send(sendPacket); 

      //Receive the first message from server 
      recvPacket = new DatagramPacket(recvBuffer, recvBuffer.length); 
      s.receive(recvPacket); 
      System.out.println(new String(recvPacket.getData())); 

      //Send the answer for the first Message to server (first operand) 
      sendBuffer = cn.nextLine().getBytes(); 
      sendPacket = new DatagramPacket(sendBuffer, sendBuffer.length, ADRSS, PORT); 
      s.send(sendPacket); 

      //Receive the second message from server 
      recvPacket = new DatagramPacket(recvBuffer,recvBuffer.length); 
      s.receive(recvPacket); 
      System.out.println(new String(recvPacket.getData())); 

      //Send the answer for the second Message to server (second operand) 
      sendBuffer = cn.nextLine().getBytes(); 
      sendPacket = new DatagramPacket(sendBuffer, sendBuffer.length, ADRSS, PORT); 
      s.send(sendPacket); 

      //Receive the third message from server 
      recvPacket = new DatagramPacket(recvBuffer, recvBuffer.length); 
      s.receive(recvPacket); 
      System.out.println(new String(recvPacket.getData())); 

      //Send the answer for the third Message to server (operation) 
      sendBuffer = cn.nextLine().getBytes(); 
      sendPacket = new DatagramPacket(sendBuffer, sendBuffer.length, ADRSS, PORT); 
      s.send(sendPacket); 

      //Receive the result from server (result of operation) 
      recvPacket = new DatagramPacket(recvBuffer, recvBuffer.length); 
      s.receive(recvPacket); 
      System.out.println(new String(recvPacket.getData())); 
     }catch(IOException e){ 
      e.printStackTrace(); 
     } 
    } 

} 
+0

異常名*是不言自明這裏,它沒有任何與客戶或服務器或UDP。 – EJP 2013-10-11 03:15:20

回答

0

double n1 = Double.parseDouble(new String(recvPacket.getData()));

這一行造成的錯誤,因爲你是從客戶端發送字符串和服務器上的雙重期待。你很可能也會面對與變量n2相同的問題。所以,只要把它們當作字符串,就會很好。

+0

對於測試,我試圖從客戶端發送數字1,然後我得到了這個錯誤,我從客戶端發送到服務器的第一條消息是字符串它的作品,但第二條消息必須是一個數字時我發送它,我從我試圖發送這個字符串的錯誤消息中得到:'1lientconnectée',它看起來像sendPacket保留了舊消息,然後舊消息中的第一個字母被替換爲我試圖發送的數字 – user2280288 2013-04-21 02:05:51

+0

我並不是想表達自己的意思,但我強烈建議你多練習一點。首先,你得到的異常應該引導你直接到這一行,尋找和發現異常和代碼之間的聯繫,以便下次可以做到這一點,Java例外是令人敬畏的故障排除工具!其次,在解析它之前,將新字符串記錄到控制檯或文件 - 您的問題應該很快就會變得明顯。您可能還想將「1」,「1.0」和「1lient」傳遞給parseDouble,並查看它們各自的作用。 – 2013-04-21 03:31:46