在Unity Android应用程序中使用广播接收UDP数据包

本文关键字:广播 UDP 数据包 Unity Android 应用程序 | 更新日期: 2023-09-27 18:04:34

我目前正在创建一个Unity Android应用程序(GearVR),可以接收在Wi-Fi上广播发送的UDP数据包。不幸的是,我不能在我的申请中收到任何包。这是我附加到一个3d游戏对象的脚本。

public class UDPSceneScript : MonoBehaviour {
Thread udpListeningThread;
Thread udpSendingThread;
public int portNumberReceive;
UdpClient receivingUdpClient;
private void initListenerThread()
{
    portNumberReceive = 5000;
    Console.WriteLine("Started on : " + portNumberReceive.ToString());
    udpListeningThread = new Thread(new ThreadStart(UdpListener));
    // Run in background
    udpListeningThread.IsBackground = true;
    udpListeningThread.Start();
}
public void UdpListener()
{
    receivingUdpClient = new UdpClient(portNumberReceive);
    while (true)
    {
        //Listening 
        try
        {
            IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
            //IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Broadcast, 5000);
            // Blocks until a message returns on this socket from a remote host.
            byte[] receiveBytes = receivingUdpClient.Receive(ref RemoteIpEndPoint);
            if (receiveBytes != null)
            {
                string returnData = Encoding.ASCII.GetString(receiveBytes);
                Console.WriteLine("Message Received" + returnData.ToString());
                Console.WriteLine("Address IP Sender" + RemoteIpEndPoint.Address.ToString());
                Console.WriteLine("Port Number Sender" + RemoteIpEndPoint.Port.ToString());
                if (returnData.ToString() == "TextTest")
                {
                    //Do something if TextTest is received
                }
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }
    }
}
void Start()
{
    initListenerThread();
}
}

使用SocketTest 3.0程序,我将"TextTest"发送到地址255.255.255.255,端口5000(我也尝试过直接瞄准智能手机的IP,但也没有成功)

Thanks in advance

在Unity Android应用程序中使用广播接收UDP数据包

对您的代码进行了快速测试,得出的结论是您的客户端代码很好。将所有Console.WriteLine替换为Debug.Log,您将收到您正在广播的数据。Console.WriteLine不显示任何东西在Unity的控制台。

如果问题仍然存在,请理解某些操作系统会阻止您广播到255.255.255.255。如果是这种情况,那么获取您正在广播的设备的IP并将最后一个octet替换为255。广播到那个IP地址,它也会像255.255.255.255一样工作。

例如您的IP为192.168.1.13,则将13替换为255。在这种情况下,您应该广播到192.168.1.255

最后,将下面的代码放入您的客户端脚本中,以确保当您单击编辑器中的停止按钮时杀死Thread,否则您将在开发过程中遇到许多问题。

 void OnDisable()
 {
     if (udpListeningThread != null && udpListeningThread.IsAlive)
     {
         udpListeningThread.Abort();
     }
     receivingUdpClient.Close();
 }