2013-04-21 2 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

ответ

0

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

Эта строка вызывает ошибку, так как вы отправляете строки от клиента и ожидает двойной на сервере. Вероятно, вы столкнулись с той же проблемой с переменной n2. Итак, просто относитесь к ним как к String, и все будет хорошо.

+0

Для теста я попытался отправить номер 1 от клиента, а затем получил эту ошибку, первое сообщение, которое я отправляю от клиента на сервер, который является String, работает, но затем второе сообщение, которое должно быть числом, когда Я отправляю его из сообщения об ошибке, которое я пытался отправить этой строкой: '1lient connectée', похоже, что sendPacket хранит старое сообщение, а затем первая буква в старом сообщении заменяется номером, который я пытался отправить – user2280288

+0

Я не пытаюсь быть скупым или банальным, но я настоятельно рекомендую вам немного отлаживать отладку. Во-первых, исключение, которое вы получили, должно было привести вас прямо к этой строке, посмотреть и найти эту связь между исключением и кодом, чтобы вы могли сделать это в следующий раз, исключения java - это удивительные инструменты для устранения неполадок! Во-вторых, запишите новую строку в консоль или файл перед ее разбором - ваша проблема должна стать очевидной быстро. Вы также можете передать «1», «1.0» и «1lient» в parseDouble и посмотреть, что они делают. –

Смежные вопросы