Unity UDPClient не получает трансляцию на сборке Android. Редактор работает. Таргетинг на IP телефона работает - PullRequest
0 голосов
/ 06 июля 2018

Я использую очень стандартный код клиента UDP. Он отлично работает в редакторе Unity. Но при сборке на андроид телефон я не получил ответа. Отправитель - это хорошо протестированная программа для Windows (я также пробовал других отправителей udp из сети), и я только строю клиент получателя. Отправитель находится в режиме широковещания UDP и отправляет на номер 255.255.255.255:60888 В Unity работает нормально, но при сборке на телефоне ничего не печатает. Однако, переключая отправителя на прямой IP-адрес телефона, он работает нормально и распечатывает данные. Я попытался поставить конечную точку получения с IPAddress.Broadcast / Any / 255.255.255.255 / 192.168.1.255.

Все они работают в редакторе, но ни один не работает в Android. Пробовал другие порты тоже и такой же. Я прочитал что-то о многоадресной блокировки от Android и попытался, не работает. Некоторые предположили, что HTC не получает трансляцию (зависит от оборудования). Однако телефон (не HTC) имеет встроенный видеоплеер, который может быть запущен для трансляции udp. Мой отправитель может отправить и подтянуть игрока. Я думаю, что это нативное приложение с использованием Java Datagram Socket. Интересно, это ошибка Unity или ошибка прошивки. Пробная версия Unity: 5.6.3, 2017.2.1, 2017.4.2.

Код ниже:

public class UDPClient : MonoBehaviour {

 Thread receiveThread;
 int remotePort = 60888;
 int clientPort = 60666;
 UdpClient _udpClient;
 // Use this for initialization
 void Start ()
 {
     if (Application.isEditor)
     {
         Application.runInBackground = true;
     }
     _udpClient = new UdpClient(clientPort);
     _udpClient.Client.ReceiveBufferSize = 1024;
     receiveThread = new Thread(new ThreadStart(ReceiveTask));
     receiveThread.Start();


 }

 void ReceiveTask()
 {
     IPEndPoint remoteEP = new IPEndPoint(IPAddress.Broadcast, 0);
     while (true)
     {
         try
         {
             byte[] data = _udpClient.Receive(ref remoteEP);
             if (data != null && data.Length > 0)
             {
                 Debug.Log("received: " + remoteEP.ToString() + " length: " + data.Length + " data: " + data[1].ToString());
             }
             else {
                 Thread.Sleep(10);
             }
         }
         catch (System.Exception ex)
         {
             throw (ex);
         }
     }
 }

 void CleanUp()
 {
     Debug.Log("cleanning Thread");
     if (receiveThread != null)
     {
         receiveThread.Abort();
     }
     receiveThread = null;
     _udpClient.Close();
     _udpClient = null;

 }

 void OnApplicationQuit()
 {
     CleanUp();
 }
}
...