2013-04-03 59 views
3

我正在写一个Android UDP客户端连接到Windows服务器并双向通信(发送和接收消息之间没有关系)。一旦最初的数据报被发送到服务器,我希望能够随时向任一方向发送数据。我的问题是:维护一个双向UDP连接

1)保持初始套接字打开并将其用于发送和接收都正确吗?

2)我应该在同一个线程(接收超时)还是在单独的线程中发送和接收(允许接收阻塞)?

3)如果在一定的时间间隔内没有发送/接收数据,套接字是否会自动关闭?

回答

6
  1. 是的,这是没问题的,也是处理双向通信最方便的方法。另外,如果客户端位于NAT后面,则hole punching需要正常工作。即使您绑定到客户端上的相同IP和端口,也不保证在NAT中获得相同的映射。因此,服务器可能无法到达客户端。请记住,这些映射超时并从NAT网络内部启动,因此如果客户端闲置很长时间,可能需要进行一些探测。

  2. 这取决于您如何设计应用程序,但这样做没有问题。只需使用例如select来监视套接字的读写状态。如果你创建了一个与读/写队列结合的非阻塞套接字,你肯定不会阻止操作。由于UDP要么写入所有内容,要么什么也不写,队列非常简单。

  3. 根据我的经验,这是Android上的特定供应商。有些手机长期打开插座,有些手机会在一段空闲时间后关闭它们。当设备进入睡眠状态(按下电源按钮时的状态)时,所有手机似乎都会关闭套接字,除了那些与后台任务相关的手机外。

+0

感谢您的全面回答:) –