2015-04-13 3 views
1

У меня есть UDP-передача и прием, который работает на моем устройстве Samsung Galaxy Ace Plus (S7500), но тот же код не работает в других устройствах, например Samsung Galaxy S4. У меня нет никаких ошибок.Android UDP не принимается на некоторых устройствах

Отправить:

public class SendThread extends Thread { 

byte[] receiveData = new byte[1024]; 
DatagramSocket serverSocket = null; 


public SendThread() { 
    this.start(); 
} 

public void run() { 
    DatagramSocket serverSocket = null; 
    byte[] receiveData = new byte[1024]; 
    byte[] sendData = new byte[1024]; 

    try { 
     serverSocket = new DatagramSocket("MY SOCKET PORT"); 
     InetAddress IP = InetAddress.getByName("MY IP"); 
     String send= "I am Android"; 
     sendData = send.getBytes(); 
     DatagramPacket send = new DatagramPacket(sendData, sendData.length, IP, "MY SEND PORT"); 
     serverSocket.send(send); 

     serverSocket.close(); 
    } catch (Exception e) { 
    } 

} 

}

Прием:

public class ReceiveThread extends Thread { 

byte[] receiveData = new byte[1024]; 
DatagramSocket serverSocket = null; 
boolean isActive = true; 

public ReceiveThread() { 
    this.start(); 
} 

public void run() { 

    DatagramSocket serverSocket = null; 
    byte[] receiveData = new byte[1024]; 

    while (isActive) { 
     try { 
      serverSocket = new DatagramSocket("MY RECEIVE PORT"); 

      DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); 
      serverSocket.receive(receivePacket); 
      String sentence = new String(receivePacket.getData()); 
      System.out.println("RECEIVED: " + sentence); 

      serverSocket.close(); 

     } catch (Exception e){ 
     } 
    } 
} 

}

ответ

0

Эта проблема ocurred потому, что некоторые устройства блокировки приемника датаграммы, поскольку безопасность протокола осуществляется заводом.

Ваш код не является неправильным, но вам необходимо изменить DatagramSocket для MulticastSocket.

Для этого ваша потребность выполнить несколько шагов:

Во-первых, это необходимо, чтобы добавить польз-разрешение:

<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" /> 

На AmdroidManifest.xml

Во-вторых, необходимо создать MulticastLock; Без этого MulticastSocket работает неправильно;

WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
multicastLock = wifi.createMulticastLock("multicastLock"); 
multicastLock.setReferenceCounted(true); 

В-третьих, замените DatagramSocket на MulticastSocket. Только для методов приема необходимо ввести код ниже или аналогичный:

MulticastSocket ms = new MulticastScoket("Your socket port"); 
ms.joinGroup("Your IP"); 

Не требуется никаких изменений для отправки сообщений.

Я использую multcast ip равным 239.255.255.255. Попытайтесь использовать многоадресный IP-адрес, потому что неправильный ip будет блокировать поток метода правильно.

И, наконец, перед использованием MulticastSocket необходимо выполнить MulticastLock.acquire(), а после использования выполнить MulticastLock.release();

Он может быть отправлен на обслуживание и приобрести или освободить MulticastLock при запуске или остановке службы.

Смежные вопросы