2012-04-27 48 views
0

我正在運行一個主動循環等待UDP數據包的線程。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花費大約3/4秒來顯示50條日誌文本消息「測試」!

因此,似乎Android的虛擬機正在保存某處緩衝區中的所有數據包,並在可能時處理它!

我需要在Android中儘快處理數據報的數據包。

看來我失去了一些東西。

任何意識到這是最好的方式來做到這一點?!

+0

有時更新日誌還費時,所以不知道你指的是哪個時間。其次,我會建議記錄收到的時間。 – kosa 2012-04-27 18:32:28

+0

你的問題究竟是什麼/每秒只接收20或50包的奇怪行爲?是的,低級網絡硬件和軟件會做一些緩衝。 – zapl 2012-04-27 18:41:56

+0

@thinksteep我需要在收到後立即處理數據包。例如。 doSomething的(消息); Log.d只是一個例子。 – Jorge 2012-04-27 19:16:56

回答

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);