为什么android udp套接字使用socket.recieve()方法丢失数据包?

为什么android udp套接字使用socket.recieve()方法丢失数据包?,android,sockets,udp,packet,android-networking,Android,Sockets,Udp,Packet,Android Networking,我只是尝试使用套接字的recieve()方法 当我发送短字符串的数据时,如“send data”,为100 有时,recieve()函数执行得很好 当我发送长字符串的数据时,如“将数据发送到 客户端,向客户端发送数据,向客户端发送数据,向 客户端,向客户端发送数据,向客户端发送数据,发送数据 向客户端发送数据“,发送100次,接收次数() 函数不能很好地执行 在android项目中: 它只收到了大约30个数据包,也就是说,当我使用另一台计算机发送数据包时,其他70个数据包丢失了。但我检查了接

我只是尝试使用套接字的
recieve()
方法

  • 当我发送短字符串的数据时,如
    “send data”
    ,为100 有时,recieve()函数执行得很好

  • 当我发送长字符串的数据时,如
    “将数据发送到
    客户端,向客户端发送数据,向客户端发送数据,向
    客户端,向客户端发送数据,向客户端发送数据,发送数据
    向客户端发送数据“
    ,发送100次,接收次数() 函数不能很好地执行

在android项目中:

它只收到了大约30个数据包,也就是说,当我使用另一台计算机发送数据包时,其他70个数据包丢失了。但我检查了接收缓冲区的大小,它足以容纳100个以上的数据包

当我使用localhost地址进行测试时,它接收所有100个数据包。我使用名为wireshark的捕获工具捕获数据包,捕获工具每次可以捕获100个数据包

因此,我可以消除另一台计算机没有发送所有数据包的可能性。因此,我将问题包含在模拟器中

以上两种情况都发生在android项目中,所以接收缓冲区大小相同, 为什么在前者会丢失数据包


在java项目中:它也接收所有100个数据包。

如果您需要所有数据包,那么您应该使用TCP/IP协议。在UDP协议中,您可能会丢失数据,因为它不支持像Tcp/ip这样的可靠连接。UDP旨在以不可靠的连接为代价加快数据传输速度。根据网络路由,您收到的数据包也可能以不同的顺序到达。

Emulator TCP/IP堆栈的udp缓冲区大小小于计算机。因此,如果UDP缓冲区填满,仿真器TCP/IP堆栈将开始丢弃数据包。PC TCP/IP堆栈以模拟器无法处理的更快速度推送数据。您可以尝试降低发送方端的速率,以避免填充模拟器缓冲区,或者使用SO_RCVBUF socket选项将android应用程序的接收套接字缓冲区大小增加到更大的值。

所有UDP套接字都会丢失数据包。它与Java或Android没有任何关系。从设计上看,这是一个不可靠的协议。我完全同意你的观点。你是对的,但是为什么socket.setReceiveBufferSize()不能在模拟器上工作呢?也许它会在真正的adroid设备上运行良好。再次感谢您耐心地阅读我糟糕的英语句子!