2015-05-16 1 views
1

Я пытаюсь сделать многоадресную рассылку в android. У меня есть три телефона (все Galaxy S5). На одном телефоне включен Wi-Fi-модем и действует как AP (мобильные данные отключены). Из двух других телефонов один передает на многоадресный адрес, который получает другой, причем оба подключены к AP первого телефона. Передающий и принимающий телефон поддерживаются бок о бок. я обнаружил, что 1000 пакетов, которые я посылаю, я получаю только около 200. Ниже приведено краткое описание того, как я посылаюAndroid multicast высокой потери пакетов

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» количество полученных пакетов увеличивается. Я предполагаю, что это связано с загрузкой процессора или буфером приема, но в любом случае я хочу многоадресные пакеты размером 1400 байт и получать как можно больше (я знаю, что количество принятых пакетов является функцией канала между двумя телефонами но я думаю, что держать их бок о бок - это самый лучший канал, который можно получить). Кроме того, когда я выполняю одноадресную рассылку UDP, я могу получить около 900 из 1000 отправленных пакетов. Я не могу понять, почему количество принятых пакетов настолько мало для многоадресной рассылки. Что мне не хватает?

+0

Вы разблокируете WifiManager.MulticastLock? http://developer.android.com/reference/android/net/wifi/WifiManager.MulticastLock.html также см. это: http://stackoverflow.com/questions/11634942/android-multicast-is-only-working-using -255-255-255-255-адрес – anil

ответ

0

Ваш сервер отправляет пакеты как можно быстрее. В вашей цепочке отправителей нет ничего, что бы снизить скорость передачи отправляемых пакетов. Таким образом, каждый пакет отправляется на микросекунду. Скорее всего, что-то по сетевому стеку приведет к пополнению некоторых буферов. UDP не имеет встроенного контроля потока или контроля перегрузки. Если у вас может быть небольшая задержка (от 1 мс до 5 мс) между пакетами, вы, вероятно, увидите гораздо меньшую потерю пакетов.

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 
}