2012-04-27 12 views
0

UDPパケットを待っているアクティブループを持つスレッドを実行しています。UDPデータグラムパケット受信ループ遅延

メッセージを受信したときに処理します。

1秒あたり数個のパケット(〜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でできるだけ早くデータグラムのパケットを処理する必要があります。

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

これを行う最善の方法は何ですか?

+0

は時々あなたが参照している時間を確認してくださいログにも時間がかかるを更新し、そうではありません。第二に、私はログ受信時間を提案します。 – kosa

+0

あなたの問題は何ですか/毎秒20または50のパッケージしか受け取らないという奇妙な動作ですか?はい、低レベルのネットワークハードウェアとソフトウェアは、いくつかのバッファリングを行います。 – zapl

+0

@thinksteep私は受け取った直後にパケットを処理する必要があります。例えば。 doSomething(メッセージ); Log.dは単なる例です。 – Jorge

答えて

1

あなたが急いでいる場合は、:

  • は、すべてのあなたのパケットを受信行われ、あるいは少なくとも最小限の量を記録していた後、UDP
  • ログのリスニングする前に、すべてのオブジェクトを作成しますまれに。

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

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); 
関連する問題