UDP socket.receive工作机制与Android单线程接收UDP包的必要性疑问
关于Android UDP接收缓冲区与线程的问题解答
老哥,先给你把这个事儿说透:
首先明确UDP socket的接收逻辑:
- 不是只有你调用
socket.receive()的时候,网络层才去接收数据包。实际上,系统内核会维护一个专门的UDP接收缓冲区,只要你的socket处于监听状态,网络过来的UDP数据包会先被内核接收,并存到这个缓冲区里。 - 你调用
socket.receive()的动作,本质是从内核的这个缓冲区里读取数据——如果缓冲区是空的,receive()就会阻塞,直到有新的数据包进来;如果缓冲区里已经有数据了,就直接取出返回。
回到你的场景:每40ms发一次包,线程处理数据后能在40ms内回到接收状态。这种情况下完全不需要双接收线程,原因有两个:
- 内核缓冲区会帮你暂存这段时间内的数据包(只要缓冲区没被占满),你的单线程调用
receive()时,能直接取到缓冲区里的包,不会丢(只要缓冲区大小足够,默认的缓冲区一般都能覆盖你这个40ms间隔的场景)。 - 双线程反而会带来问题:两个线程同时调用同一个socket的
receive(),会出现抢数据的情况,你还要额外做同步控制,完全没必要画蛇添足。
补充个细节:如果你的数据包量很大,担心缓冲区满了丢包,可以通过socket.setReceiveBufferSize(int size)调整缓冲区大小,但前提是系统允许(有些系统会有上限)。不过按你的40ms间隔来看,默认大小应该足够用。
总结一下:单线程完全够用,内核缓冲区会帮你存好数据包,等你调用receive()的时候读取就行,不用搞双接收线程。
内容的提问来源于stack exchange,提问作者alsaleem
相关产品推荐
相关产品推荐

