我正在编写一个 Android UDP 客户端,它与 Windows 服务器连接并双向通信(发送和接收的消息之间没有关系)。将初始数据报发送到服务器后,我希望能够随时向任一方向发送数据。我的问题是:
1)保持初始套接字打开并将其用于发送和接收是否正确?
2)我应该在同一个线程中发送和接收(接收超时)还是在单独的线程中(允许接收阻塞)?
3)如果在一定间隔内没有发送/接收数据,套接字会自动关闭吗?
是的,这没问题,是处理双向通信最方便的方式。此外,如果客户端位于 NAT 之后,则需要打孔才能正常工作。即使您绑定到客户端上的相同 IP 和端口,也不能保证在 NAT 中获得相同的映射。因此,服务器可能无法访问客户端。请记住,这些映射超时并从 NAT'ed 网络内部启动,因此如果客户端长时间空闲,可能需要进行一些探测。
这取决于您如何设计应用程序,但这样做没有问题。只需使用例如 select 监视套接字的读取和写入状态。如果您创建一个结合读/写队列的非阻塞套接字,您肯定不会阻塞操作。由于 UDP 要么写入所有内容,要么不写入任何内容,因此队列非常简单。
根据我的经验,这在 Android 上是特定于供应商的。有些手机会长时间保持套接字打开,而另一些手机会在一段时间后关闭它们。当设备进入睡眠状态(按下电源按钮时的状态)时,所有手机似乎都会关闭套接字,除了与后台任务相关的那些。