Android多播高丢包

时间:2015-05-16 09:18:27

标签: android udp multicast

我正在尝试在android中进行多播。我有三部手机(所有Galaxy S5)。一部手机已打开Wifi网络并充当AP(移动数据已关闭)。在另外两部电话中,一部分正在发送到另一部正在接收的多播地址,两者都连接到第一部电话的AP。发送和接收电话并排放置。 我发现我发送的1000个数据包,我只收到大约200个。下面是我发送的大纲

MulticastSocket mMulticastSocket = new MulticastSocket(port);
InetAddress multicastGrp = InetAddress.getByName("239.255.255.250");
mMulticastSocket.joinGroup(multicastGrp);
String sendStr = "";
int packetSize = 1400;
for(int i = 0; i < packetSize; i++)
sendStr = sendStr+"a";

for(int i = 0; i < 1000; i++)
mMulticastSocket.send(new DatagramPacket(sendStr.getBytes(), sendStr.getBytes().length, mMulticastSocket, port);

接收就像,

//acquire multicast lock
byte[] buffer = new buffer[2048];
DatagramPacket rPack = new DatagramPacket(buffer, buffer.length);
mMulticastSocket.setReceiveBufferSize(1024*64);
int recvCount = 0;
while(true) {
mMulticastSocket.receive(rPack);
recvCount++;
}
//release multicast lock

发送和接收都在工作线程中完成。我还发现,随着'packetSize'的值减小,接收的数据包的数量也在增加。我想这是由于CPU负载或接收缓冲区,但无论如何,我想组播大小为1400字节的数据包并尽可能多地接收(我知道接收到的数据包数量是两部手机之间通道的函数)但我认为保持并排几乎是最好的渠道。此外,当我正在进行UDP单播时,我能够接收发送的1000个数据包中的大约900个。 我无法理解为什么接收数据包的数量对于多播而言如此之低。我错过了什么?

1 个答案:

答案 0 :(得分:0)

您的服务器正在尽快发送数据包。发送器循环中没有任何内容可以阻止正在发送的数据包的数据速率。因此,每个数据包将以微秒为单位发送。很可能沿着网络堆栈的某些东西会导致一些缓冲区被填满。 UDP没有内置的流量控制或拥塞控制。如果你可以在数据包之间有一些小的延迟(~1ms到5ms),你可能会看到更少的数据包丢失。

for (int i = 0; i < 1000; i++)
{
    mMulticastSocket.send(new DatagramPacket(sendStr.getBytes(), 
    sendStr.getBytes().length, mMulticastSocket
    Thread.sleep(5, 0);   // quick hack to throttle back rate
}