2016-04-05 6 views
1

Dieses Problem hat mir die ganze Nacht den Kopf gerissen und ich kann nicht herausfinden, warum es nicht funktioniert. Also führe ich ein Client/Server-Programm aus und lasse den Client eine bestimmte Zeichenfolge über JOptionPane eingeben und dann an den Server senden. Der Server verfügt über ein Array von Strings und überprüft, ob die vom Client empfangene Zeichenfolge mit einer der Strings im Array übereinstimmt. Der Vergleich scheint jedoch fehlgeschlagen zu sein. Ich würde mich freuen, wenn mir jemand sagen könnte, warum ich auf dieses Problem stoße.Java if-Anweisung schlägt fehl, wenn zwei Strings verglichen werden

Unten ist der Code für meinen Server, Wo die if-Anweisung innerhalb der for-Schleife versagt, und das Array (usrs):

String [] usrs = {"Hassan","Jimmy","Bob","Kevin"}; 

DatagramSocket skt = null; 

try { 
    skt = new DatagramSocket(2002); 
    byte [] buffer = new byte [1000]; 
    String okay = "OK"; 
    while(true) { 
     System.out.println("Inside loop"); 
     DatagramPacket request = new DatagramPacket(buffer,buffer.length); 
      skt.receive(request); 
     String userName = (new String(request.getData())); 
     System.out.println(userName); 
     for (int i=0; i < usrs.length; i++) { 
      System.out.println(usrs[i]); 
      //if user exists in list of verified users,we send the RSA encrypted AES Key using that user's public key which we receive from the user 
      if (userName.equals(usrs[i])) { 
       System.out.println("Inside If"); 
       byte [] okayMsg = okay.getBytes(); 
       DatagramPacket reply = new DatagramPacket(okayMsg,okayMsg.length,request.getAddress(),request.getPort()); 
       skt.send(reply); 
       skt.close(); 
      }    
     } 
    } 

Hier ist mein Code für den Client ist:

try {  
    skt = new DatagramSocket(); 
    String userName = JOptionPane.showInputDialog(null,"Please enter your username"); 
    byte [] b = userName.getBytes(); 
    InetAddress host = InetAddress.getByName("localhost"); 
    int serverSocket = 2002; 
    DatagramPacket request = new DatagramPacket(b,b.length,host,serverSocket); 

    skt.send(request); 

    byte [] buffer = new byte[1000]; 

    DatagramPacket reply = new DatagramPacket(buffer,buffer.length); 

    skt.receive(reply); 

    String replyData = new String(reply.getData()); 
    System.out.println(replyData); 

    skt.close(); 
} catch(Exception e) { 
    e.printStackTrace(); 
}; 

Und hier ist die Ausgabe:

Inside loop 
Hassan 
Hassan 
Jimmy 
Bob 
Kevin 
Inside loop 
+0

Können Sie sicherstellen, dass keine Leerzeichen oder andere unsichtbare Zeichen vorhanden sind? –

+0

Von der Ausgabe scheint es, für die Zeichenfolge "Hassan" übergeben ?? –

+0

Nein, hat es nicht! es ist nicht in "Inside if" Block –

Antwort

1

Offenbar die request.getLength() Druck löst das issue e. Die empfangene Antwort wurde auf die Größe des Antwortpuffers aufgefüllt.

2

Sie müssen die Länge des DatagramPacket überprüfen, wenn replyData Konstruktion:

String replyData = new String(reply.getData(), 0, reply.getLength()); 

Andernfalls wird angenommen, dass das gesamte Array von reply.getData() enthält String-Daten zurückgegeben, die nicht unbedingt der Fall ist, wie Sie gefunden.

Es ist auch sinnvoll explizite Zeichencodierung zu verwenden, damit Sie nicht seltsame Verhalten bekommt aufgrund nicht übereinstimmen Standardzeichencodierungen auf den Client- und Server-JVMs:

byte [] b = userName.getBytes(StandardCharsets.UTF_8); 

und

String replyData = new String(..., StandardCharsets.UTF_8); 
Verwandte Themen