2017-10-25 4 views
1
public class MyClass{ 
static final String BROADCAST = "Broadcasting"; 
public static final int PORT = 12344; 
public static String host = "localhost"; 
public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    DatagramSocket serverSocket; 
    try { 
     serverSocket = new DatagramSocket(PORT); 
     InetAddress addr = InetAddress.getByName(host); 

     byte[] sendData = BROADCAST.getBytes(); 

     DatagramPacket sendPacket = new DatagramPacket(
       sendData, //data byte array 
       sendData.length, //number of bytes 
       addr, //destination host address 
       PORT); //destination port 
     serverSocket.send(sendPacket); 
     byte[] rcvData = new byte[1024]; 

     DatagramPacket rcvPacket = new DatagramPacket(
       rcvData, rcvData.length); 

     //packet gets filled in by receive 
     serverSocket.receive(rcvPacket); 

     //Why the two Strings are not the same? 
     //Why the bytes derived from the same string different? 
     byte[] a = rcvData; 
     byte[] b= BROADCAST.getBytes(); 
     System.out.println(a.equals(b)); 
     System.out.println(new String(a)); 
     System.out.println(new String(b)); 
     System.out.println((new String(a).equals(new String(b)))); 


    } catch (SocketException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (UnknownHostException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 
} 

ich bemerkt habe, dassString in Bytes können nicht auf die äquivalenten Strings konvertieren

1) Die Byte-Arrays I got verschieden sind getByte() Methode verwendet.

2) Obwohl die Zeichenfolge von a und b (aus dem Code) genau gleich sind, aber sie sind nicht gleich. Hier

ist der Ausgang I aus vier Druckanweisungen erhalten:

false 

Broadcasting 

Broadcasting 

false 
+1

Können Sie nicht einen Debugger verwenden und die 'real' Daten sehen? –

+1

rcvData ist ein Byte [] der Länge 1024, während "Broadcasting" .getBytes() kürzer sein muss. Außerdem vergleichen Sie Arrays nicht so (Sie sollten Arrays.equals (arr1, arr2) verwenden). –

+1

Da die Länge von "a" 1024 ist und die Länge von "b" (höchstwahrscheinlich) 12 ist - wie würden Sie erwarten, dass diese beiden gleich sind? Aber eigentlich sind die Dinge noch schlimmer als in https://stackoverflow.com/questions/8777257/equals-vs-arrays-equals-in-java –

Antwort

-1

ich durch die Hilfe von trim denken() Sie erreichen können, was Sie expect.May Byte a und b unterschiedliche Größe Einsatz sein trim(), während convering Byte in String

 byte[] a = rcvData; 
     byte[] b= BROADCAST.getBytes();  
     System.out.println(new String(a).trim()); 
     System.out.println(new String(b).trim()); 
     System.out.println((new String(a).trim().equals(new String(b).trim()))); 
+0

'trim()' wird nicht funktionieren, wenn der verwendete Puffer ein vorheriges Empfangspaket enthält, das länger ist als das aktuelle. – Alex

1

Ihr Empfang Code nicht korrekt ist, weil das eingehende Paket nicht immer die gleiche Größe wie Ihre Empfangspuffer ist. Sie müssen also die Länge Ihrer Daten begrenzen, indem Sie sie in String umwandeln, sonst konvertieren Sie auch Müll.

byte[] a = rcvData; 
byte[] b = BROADCAST.getBytes(); 
String recStr = new String(rcvData, 0, rcvPacket.getLength()); 
System.out.println(recStr.equals(new String(b))); 

Dann vergleichen Sie wirklich den Sende- und Empfangspaket-Inhalt genau.

0

Es gibt Probleme in Ihrem Code

Erste

Ihr Code:

byte[] rcvData = new byte[1024]; 

Es sollte: (Wenn es nicht funktionale Anforderung ist)

byte[] rcvData = new byte[BROADCAST.getBytes().length]; 

Zweite

Ihr Code:

System.out.println(a.equals(b)); 

Es sollte:

System.out.println(Arrays.equals(a,b)); 
+0

Ich denke, das OP testet das Senden und Empfangen 'DatagramPacket'. Unter der Annahme, dass der Client Pakete in variabler Größe sendet, weiß der Server die Größe anderer Pakete nicht. Daher ist es nicht sinnvoll, wenn Sie die Array-Größe genau gleich der sendenden Array-Größe definiert haben. – Alex

+0

Ja, Sie haben Recht @Alex, aber wenn es so ist, dann auch Sie Code wird nicht funktionieren im Falle von langen Daten in diesem Fall müssen wir Schleife verwenden, um Daten aus dem Stream abrufen, Sie sind richtig Bro ...! –

+0

Und ich wollte @Shixu Zhang nur an den Punkt umleiten und das ist die Länge der Daten ist nicht gleich der Länge des Arrays, in dem Sie diese Daten speichern. –

Verwandte Themen