Я использую очень стандартный код клиента 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();
}
}