2011-12-19 10 views
4

受信したDatagramPacketを文字列に変換しようとしましたが、小さな問題があります。何が最善の方法であるかわからない。DatagramPacket to string

私が受け取るデータは、ほとんどが未知の長さであるため、受信側にバッファ[1024]が設定されています。問題は、...私は、文字列 "ABC" を送って、私の受信側で次の操作を行うとしている私は次の出力を得る

buffer = new byte[1024]; 
packet = new DatagramPacket(buffer, buffer.length); 
socket.receive(packet); 
buffer = packet.getData(); 
System.out.println("Received: "+new String(buffer)); 

:ABC [] [] [] [] [] [] [] .....バッファの長さまで。 私は最後にすべてのジャンク/ヌルが無視されているはずだと推測していますので、何か間違っていなければなりません。 "私はbuffer.lengthが問題であることを知っています。私のうちはちゃんと出てきます。

感謝。

答えて

8
new String(buffer, 0, packet.getLength()) 
+0

を試してみてください。アウトは完全に無意味になった。また、eclipseはメソッドString(byte []、int)が非推奨であることを警告します。私は彼が受信する文字列の正確な長さでバッファを初期化すると、すべてがうまくいくが、それでも同じ問題で立ち往生した。文字列の長さはあらかじめわかっていません。 – user1105216

+0

しかし、これは新しいString(buffer、0、packet.getLength())でも機能しました。 ありがとうございます。 – user1105216

2

のDatagramPacketの長さフィールドが実際に受信したパケットの長さを与えます。詳細についてはDatagramPacket.receiveためjavadocを参照してください。単にので

あなたは別のStringコンストラクタを使用して、バイト配列と実際のreを渡す必要があります受信バイト数。

たとえば、@ jtahlbornや@ GiangPhanThanhGiangの回答を参照してください。


ただし、バイトをUTF-16文字列にデコードする際に、文字エンコードを使用する必要があります。あなたの特定の例ではおそらくそれは問題ではありません。しかし、非ASCII文字を含む可能性のあるデータを渡している場合は、正しい文字セットを使用してデコードする必要があります。それが間違っていると、Stringの値に文字化けが生じる可能性があります。

0

私が理解しているように、DatagramPacketはちょうど最後にジャンクの束を持っています。 Stephen C.が示唆するように、受け取った実際の長さを見つけることができるかもしれません。その場合、次のように使用してください:

int realSize = packet.getLength() //Method suggested by Stephen C. 
byte[] realPacket = new byte[realSize]; 
System.arrayCopy(buffer, 0, realPacket, 0, realSize); 

長さを見つける方法はわかりません。このコードではなく

buffer = new byte[1024]; 
packet = new DatagramPacket(buffer, buffer.length); 
socket.receive(packet); 
String data = new String(packet.getData()); 
System.out.println("Received: "+data); 
+0

あなたがdownvoteに行くなら、私は次回のために私の投稿を修正することができます理由を説明してください。単純にdownvotingは役に立ちません。 –

+2

元の答えは、パケットの長さを取得することに関する意味のある情報を提供していませんでした。また、パケットの長さを知ったら、配列をコピーする必要はありません。 – jtahlborn

+0

コピーは、バッファサイズを1024からパケットサイズに減らすことです。 –

-2

用途: String msg = new String(packet.getData(), packet.getOffset(), packet.getLength());

+0

このコードはなぜ使用しますか?単純なコードは答えではありません。あなたは説明する必要があります。この特定のコードは、意味的に同じであるため、OPの元のコードよりもうまく機能しません。 – EJP

1

代わりにこのコードを使用して

0

が機能しなかったこと残念ながら

System.out.println("Received: "+new String(buffer).trim()); 

または

String sentence = new String(packet.getData()).trim(); 
System.out.println("Received: "+sentence);