3

データグラム ソケットを使用してメッセージを交換するサーバー/クライアント アプリケーションがあります。メッセージの長さが分からないため、最初はバッファ サイズを 1024 バイトに設定しました。1024 バイトより短いものを送信すると、残りの文字列が奇妙な文字 (null 文字またはどのように呼び出されるかわかりません) として表示されます。ここに画面があります: 文字列バッファのヌル文字

クライアントコード: byte[] buf = ("This is another packet.\n").getBytes(); DatagramPacket packet = new DatagramPacket(buf, buf.length, inetAddress, serverport); socket.send(packet)

サーバーコード: byte[] buf = new byte[1024]; DatagramPacket packet = new DatagramPacket(buf, buf.length); socket.receive(packet);

4

4 に答える 4

10
socket.receive(packet);
byte[] data = new byte[packet.getLength()];
System.arraycopy(packet.getData(), packet.getOffset(), data, 0, packet.getLength());
于 2013-10-11T07:51:07.007 に答える
4

DatagramPacket.getLength()受信したパケットの実際の長さを返します。ゼロ以外のオフセットでパケットを作成しない限り、それはデータが にあることを意味します{0..getLength()-1}

これは、 で作成した元の長さDatagramPacketが失われることを意味することに注意してください。これは、受信ごとに新しいを使用するDatagramPacketか、少なくとも を介してデータ バッファを再初期化する必要があることを意味しますsetData()。そうしDatagramPacketないと、受信した最小のパケットのサイズに縮小し続けます。

于 2011-11-23T00:19:13.003 に答える
1

わかりましたので、私に合った解決策を思いつきました:

    public String getRidOfAnnoyingChar(DatagramPacket packet){
        String result = new String(packet.getData());
        char[] annoyingchar = new char[1];
        char[] charresult = result.toCharArray();
        result = "";
        for(int i=0;i<charresult.length;i++){
            if(charresult[i]==annoyingchar[0]){
                break;
            }
            result+=charresult[i];
        }
        return result;
    }

編集:ByteArrayOutputStreamここで見つけることができる より良い解決策が存在します: How to reinitialize the buffer of a packet?

于 2011-11-26T17:05:58.540 に答える
1

packet.getOffset()バッファ内の受信データの開始位置を確認しpacket.getLength()、データの長さ (バイト数) を取得する必要があります。

また、受信したパケットが大きすぎて提供されたバッファーに収まらない場合 (この場合は >1024 バイト)、余分なデータは単純に破棄されることも考慮する必要があります。メモリの使用に細心の注意を払う必要がない限り、パケット全体が確実に収まるように、より大きなバッファを使用する必要があります。UDP の場合、最大パケット サイズは 64kB です。

于 2011-11-22T15:43:28.793 に答える