1

バイト配列を使用して、別のコンピューターから受信したデータ パケットを格納しています。

receivedData = new byte[1024];
receivedPacket = new DatagramPacket(receivedData, receivedData.length);
socket.receive(receivedPacket);
receivedData = receivedPacket.getData();
String res = new String(receivedData);  // PROBLEM HERE

問題は最後の行にあります。長さ 1024 のバイト ストリームとして宣言receivedDataしているためです。そのため、常に最後の行で配列全体から新しい文字列が作成されますが、実際に受け取った実際のバイト数は正確にはわかりません。だから、私は欲求不満のエラーに遭遇します:res私が望むように受信されません。(受信した実際のバイトの長さは配列全体を修正しないため)

ですから、私の質問は次のとおりです。この点を修正するにはどうすればよいですか。文字列に変換するために実際に受け取ったバイト数を知るにはどうすればよいですか?

4

3 に答える 3

4

を使ってみてくださいDatagramPacket.getLength()

receivedData = new byte[1024];
receivedPacket = new DatagramPacket(receivedData, receivedData.length);
socket.receive(receivedPacket);
receivedData = receivedPacket.getData();
String charsetName = "US-ASCII"; // set to desired charset
String res = new String(receivedData, 0, receivedPacket.getLength(), charsetName);

文字セットを追加するために編集されました。ありがとう、パルシファル

于 2013-01-07T18:32:43.857 に答える
2

javadocからDatagramSocket.receive()

データグラム パケット オブジェクトの長さフィールドには、受信したメッセージの長さが含まれます。

String次に、バイト配列とオフセットを受け取るコンストラクターを使用して構築できます。

于 2013-01-07T18:29:36.823 に答える
2

DatagramPacket.getLength()を呼び出して、実際に受信したバイト数を確認します。

そして、Stringこれらのバイトから を構築するときは、必ずエンコーディングを指定してください (そのままでは、JDK のデフォルトのエンコーディングを使用しているため、サーバーのエンコーディングとは異なる場合があります)。

于 2013-01-07T18:30:14.907 に答える