0

UDP パケットを待機しているアクティブなループでスレッドを実行しています。

メッセージを受信したら処理したい。

毎秒数パケット (~20) を受信する必要があります。

UDPパケットを受信した後にログを記録するだけの、最小限の例を挙げています

while (socketUDP != null) {
    message = new byte[6];
    packet = new DatagramPacket(message, message.length);

    try {
        socketUDP.receive(packet);
        command = new String (message, 0, packet.getLength());
    } catch (IOException e) {
        Log.e(LOG_TAG, LOG_TAG + " IOException: " + e.getMessage() );
    }

    Log.d(LOG_TAG, "test");
}

たとえば、私は 1 秒間に 50 個の UDP パケットを送信し、誰も失われず、Android は 50 個のログ テキスト メッセージ「test」を表示するのに約 3/4 秒かかるため、動作は奇妙です!!

そのため、Android の VM はすべてのパケットをバッファ内のどこかに保存し、可能な場合はそれを処理しているようです!

Android でできるだけ早くデータグラムのパケットを処理する必要があります。

何かが足りないようです。

それを行うための最良の方法はどれですか?!

4

2 に答える 2

1

お急ぎの場合は、次のとおりです。

  • UDP をリッスンする前にすべてのオブジェクトを作成する
  • すべてのパケットの受信が完了したらログに記録するか、少なくとも最小限の量をまれにログに記録します。

現在、パケットが到着するたびに、DatagramPacket と String を作成し、次に Log.e を作成します。これらはすべて、パケット自体を受信するよりもはるかに時間がかかるはずです。もちろん、最適化されたとしても、配信のリアルタイム保証はありません。

于 2012-04-27T18:47:32.303 に答える
0

パケットを送信しているデバイスに ping を試みます。それはわたしを助ける。たとえば、パケットを受信する前に次のコードを使用しています。

pingThread = new Thread(new Runnable() {
        @Override
        public void run() {
            Runtime runtime = Runtime.getRuntime();
            try {
                // Ping 10 times at 169.254.169.168
                runtime.exec("/system/bin/ping -c 10 169.254.169.168");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    });
    pingThread.start();

その後、次のように呼び出すことができます。

socketUDP.receive(packet);
于 2016-01-30T13:07:42.863 に答える