为什么android udp-socket使用socket.receive()方法关闭数据包?

时间:2014-05-05 09:11:23

标签: android sockets udp packet android-networking

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

  • 当我发送短字符串的数据时,为"send data",为100 次,receive()函数表现良好。

  • 当我发送长字符串的数据("send data to the client,send data to the client,send data to the client,send data to the client,send data to the client,send data to the client,send data to the client,send data to the client")100次时,收到() 功能不能很好地运作。

在android项目中:

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

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

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

以上两种情况都发生在android项目中,所以收到的缓冲区大小是一样的, 为什么在前者会丢包?

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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