2017-10-25 8 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(); 
    } 
} 
} 

等価文字列に変換することができません。文字列Iは</p> <p>1)Iは、getByte()メソッドを使用して得たバイト配列が異なっていることに気づいた

2)コードのaとbの文字列はまったく同じですが、それらは等しくありません。私はあなたがバイトaとbがdifferntサイズ使用されていることexpect.Mayものを達成することができますトリム()の助けによって考える

false 

Broadcasting 

Broadcasting 

false 
+1

デバッガを使用して 'real'データを見ることができません:それはすべき

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

? –

+1

rcvDataは長さ1024のbyte []ですが、 "Broadcasting" .getBytes()はより短くなければなりません。また、配列を比較する方法ではありません(Arrays.equals(arr1、arr2)を使用する必要があります)。 –

+1

'a'の長さは1024なので、' b'の長さは(おそらく)12です - どのようにそれらの2つが等しいと思いますか?しかし実際には、https://stackoverflow.com/questions/8777257/equals-vs-arrays-equals-in-javaに見られるように、事態はさらに悪化します。 –

答えて

-1

:ここ

は、私は4つの印刷ステートメントからの取得の出力であります文字列にバイトをconveringながら、着信パケットは、常にあなたの受信バッファと同じサイズではありませんので、トリム()

 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()'は、使用中のバッファが現在のパケットより長い前回の受信パケットを含んでいれば動作しません。 – Alex

1

あなたの受信コードは、正しくありません。したがって、データをStringに変換する際にデータの長さを制限する必要があります。それ以外の場合は、ゴミを変換します。

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

次に、送受信パケットの内容を正確に比較しています。

0

まず、あなたのコードに問題があります

あなたのコード:

byte[] rcvData = new byte[1024]; 

それべきである。(そうでない場合は、機能要件)

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

セカンド

あなたのコード:

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

私はOPが送信をテストしており、 'DatagramPacket'を受け取っていると思います。クライアントが可変サイズのパケットを送信すると仮定すると、サーバは他のパケットのサイズを知らない。したがって、配列のサイズを送出する配列のサイズと正確に同じに定義すると意味がありません。 – Alex

+0

はい、あなたは正しい@Alexですが、そうであれば、長さが長いデータの場合はコードが機能しません。この場合、ストリームからデータを取得するためにループを使用する必要があります。 –

+0

そして、ちょうど@Shixu Zhangをポイントにリダイレクトしたいのです。それは、データの長さが、そのデータを格納している配列の長さと等しくないことです。 –

関連する問題