2

andoridでUDPサービスを作成しています。ここにコピーされたコードの一部を明確にするために:

    byte[] message = new byte[1500];
    DatagramPacket packet = new DatagramPacket(message, message.length);                    
    socket = new DatagramSocket(Constants.LISTENING_PORT_NUMBER);
    socket.receive(packet);

問題は、UDPパケットを継続的に受信していることです。たとえば、パケット#1(250バイト長)、パケット#2(182バイト長)、パケット#3(403バイト長)など...

可変長の個別のUDPパケットを取得して処理する必要があります。UDPプロトコル仕様に従って、UDPパケットにはメッセージ境界が定義されています。しかし、UDPパケットを分離できるJavaのソリューションは見つかりませんでした。

現在のソリューションでは、読み取る必要のあるパケット長を定義する必要がありますが、受信する前にパケット長がわかりません。

私はポイントを逃していますか?


編集: トビアスとシャジンの両方に感謝します。どちらも正解です。悲しいことに、2つの答えを正解としてマークすることはできません。

socket.receive(packet);UDPパケット境界まで受信し、後続のパッケージは別ので読み取ることができますsocket.receive(packet);
私の問題は、最初のメッセージの処理中に、同期処理のために到着したそれ以降のメッセージが処理されないことです。次に、メッセージ処理を非同期タスクに渡し、到着したすべてのパケットを時間内にキャッチできるようになります。

4

2 に答える 2

2

パケットの長さを事前に知ることはできません。受信する可能性のあるデータに基づいて、最大境界バイト配列を定義できます。2048バイトの配列をお勧めします。

byte[] message = new byte[2048];

着信メッセージパケットの長さが可変の場合でも、次のコードを使用して受信できます

byte[] message = new byte[2048];
DatagramPacket packet = new DatagramPacket(message, message.length);                    
socket = new DatagramSocket(Constants.LISTENING_PORT_NUMBER);
socket.receive(packet);
String data = new String(packet.getData(), 0, packet.getLength());

getDataメソッドとgetLengthメソッドを使用して、受信したパケットのサイズを判別できます。

于 2012-11-21T13:39:46.253 に答える
1

ここで何かが足りないかもしれませんが、aDatagramPacketは送信される1つのパケットです。データにアクセスするために必要なメソッドgetLength()とメソッドがあります。送信したデータを返すものgetOffset()もあると思います。getData()

ここにあなたがさらにあなたを助けることができるリンクがあります。

于 2012-11-21T13:30:02.960 に答える