2013-04-21 3 views
-1

클라이언트/서버 응용 프로그램을 만들려고하는데 서버가 클라이언트에게 두 개의 피연산자를 쓰도록 요청한 다음 클라이언트가 결과를 다시 보내는 작업을 선택할 때 작업을 선택하도록 요청합니다. .DoubleFormatDouble()의 NumberFormatException

나는이 오류가있어 내 프로그램을 실행하려면 :

* 서버 :이 내 코드

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

} 

클라이언트 :

클라이언트에서 문자열을 전송하고 서버를 두 번 기대로
+0

여기서 예외 * 이름 *은 자명하지만 클라이언트 또는 서버 또는 UDP와는 아무런 관련이 없습니다. – EJP

답변

0

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

이 줄은, 오류의 원인이된다. 변수 n2도 같은 문제에 직면 할 가능성이 높습니다. 그래서, 그것들을 String으로 취급하십시오.

+0

테스트에서 나는 클라이언트로부터 숫자 1을 보내려고했다. 그리고 나는이 에러를 얻었다. 클라이언트로부터 서버로 보내는 첫 번째 메시지는 작동하지만, 두 번째 메시지는 숫자이어야한다. 나는이 문자열을 보내려고했다는 오류 메시지에서'1lient connectée'를 보내고, sendPacket이 이전 메시지를 보관하고 나서 이전 메시지의 첫 번째 문자가 보내려는 번호로 바뀌는 것처럼 보입니다 – user2280288

+0

나는 평균이나 진부한 태도를 취하려고하지는 않지만, 조금 더 디버깅을 연습 해 보길 강력히 권합니다. 우선, 예외가 있으면이 라인으로 바로 연결되고, 예외와 코드 사이의 링크를 찾아 다음 번에 할 수 있도록해야합니다. Java 예외는 멋진 문제 해결 도구입니다! 새 문자열을 구문 분석하기 전에 콘솔이나 파일에 두 번째로 기록하십시오. 문제가 빨리 분명 해져야합니다. 당신은 또한 "1", "1.0"및 "1lient"를 parseDouble에 전달하고 각각 무엇을하는지 볼 수 있습니다. –