2017-08-25 1 views
1

Ich versuche, eine einfache UDPServer und UDPClient zu bauen. Ein String-Vergleich funktioniert nicht.
Hier ist, was ich bisher habe:Warum funktioniert String.equals() nicht?

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

public class UDPSender 
{ 
    public static void main(String args[]) throws Exception 
     { 
     DatagramSocket serverSocket = new DatagramSocket(9877); 
      byte[] receiveData = new byte[1024]; 
      byte[] sendData = new byte[1024]; 
      boolean weiter = true; 

      do { 
        DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); 
        serverSocket.receive(receivePacket); 
        String sentence = new String(receivePacket.getData()); 
        System.out.println("RECEIVED: " + sentence); 
        InetAddress IPAddress = receivePacket.getAddress(); 
        int port = receivePacket.getPort(); 

        /*I'm trying to make the if()-statement true, but the program always enters the else()-clause, no matter what I do.*/ 
        if("Shutdown".equals(sentence)) { 
         weiter = false; 
         String bye = ("Auf Wiedersehen! Verbindung wird gekappt..."); 
         sendData = bye.getBytes(); 
         DatagramPacket sendPacket = 
           new DatagramPacket(sendData, sendData.length, IPAddress, port); 
         serverSocket.send(sendPacket); 
         serverSocket.close(); 
        } else {      
         String capitalizedSentence = sentence.toUpperCase(); 
         sendData = capitalizedSentence.getBytes(); 
         DatagramPacket sendPacket = 
           new DatagramPacket(sendData, sendData.length, IPAddress, port); 
         serverSocket.send(sendPacket);      
        } 
       } while(weiter); 
     } 
} 

Und dies ist der Kunde:

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

class UDPClient{ 

    public static void main(String args[]) throws Exception 
    { 
     BufferedReader inFromUser = 
      new BufferedReader(new InputStreamReader(System.in)); 
     DatagramSocket clientSocket = new DatagramSocket(); 
     InetAddress IPAddress = InetAddress.getByName("localhost"); 
     byte[] sendData = new byte[1024]; 
     byte[] receiveData = new byte[1024]; 

     //Look, I'm explicitly sending Shutdown, too!    
     String sentence = "Shutdown"; 
     sendData = sentence.getBytes(); 
     DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9877); 
     clientSocket.send(sendPacket); 
     DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); 
     clientSocket.receive(receivePacket); 
     String modifiedSentence = new String(receivePacket.getData()); 
     System.out.println("FROM SERVER:" + modifiedSentence); 
     clientSocket.close(); 
    } 
} 

würde ich mich freuen, wenn die beiden jetzt auf dem gleichen Computer arbeiten würde, aber nach diesem String Ausgabe ist behoben, muss ich mehr PCs beteiligt werden. Versucht über jede Lösung, die in anderen ähnlichen Fragen auf stackoverflow und allem, was Google auf den ersten drei Seiten aufgelistet hat, vorgeschlagen hat, hat nichts für mich gearbeitet. Kannst du etwas sehen, was ich nicht kann?

+1

Haben Sie t geprüft Hat 'Satz' nicht mit Nullzeichen, Leerzeichen (oder anderen nicht druckbaren Zeichen) aufgefüllt? –

+1

Nehmen Sie einen Debugger, führen Sie den Code darin aus, setzen Sie einen Breakpoint zum Vergleich, überprüfen Sie, was genau in der Variablen ist. –

+0

Mark Rotteveel, Ihr Verdacht hat sich als richtig herausgestellt. Es gab keine Charaktere. ^^; Die Lösung von Reimeus hat es für mich repariert. Danke ^^ – Aye

Antwort

0

Das Problem hier ist, dass Sie auf die feste Größe Puffer byte[] ... = new byte[1024] angewiesen sind, Pakete zu senden und zu empfangen.

Mein Rat ist, dass Sie wirklich nur die Daten gesendet werden müssen:

String sentence = "Shutdown"; 
byte[] sendData = sentence.getBytes(); 
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9877); 

... und erstellen Sie die String Instanz auf der Server-Seite entsprechend der Länge der receivePacket.getLength() Verfahren erhalten:

String sentence = new String(receivePacket.getData(), 0, receivePacket.getLength()); 

Siehe auch public String(byte[] bytes, int offset, int length)