Unity UDPClient не получает трансляцию при сборке Android. Редактор работает. Таргетинг на IP телефона работает
Я использую очень стандартный клиентский код 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();
}
}