Android多播高数据包丢失



我正在尝试在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负载或接收缓冲区的造成但是我认为将它们并肩保持几乎是最好的渠道)。另外,当我进行UDP Unicast时,我可以收到发送的1000个数据包中的900个。我无法理解为什么接收到的数据包的数量如此之少。我缺少什么?

您的服务器尽可能快地发送数据包。发件人循环中没有任何东西可以返回发送的数据包的数据速率。因此,每个数据包都被发送微秒。网络堆栈中很可能会导致一些缓冲区填充。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
}

最新更新