2012-04-27 47 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);