【问题标题】:Receiving UDP packets in Unity Android application with broadcast在 Unity Android 应用程序中通过广播接收 UDP 数据包
【发布时间】:2017-01-06 06:36:12
【问题描述】:

我目前正在创建一个 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,也没用)

提前致谢

【问题讨论】:

    标签: c# android unity3d udp broadcast


    【解决方案1】:

    对您的代码进行了快速测试,得出的结论是您的客户端代码没有问题。将所有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();
     }
    

    【讨论】:

    • 我尝试了您的解决方案,但它并没有改变任何东西。可能与允许广播的 Android Manifest 有关吗?感谢杀线程方法。
    • 您不必更改清单中的任何内容。请确保防火墙没有阻止您。检查防火墙并确保您的应用未被阻止。您使用的是哪个 Unity 版本?这在编辑器中有效吗?你是从什么设备广播的?
    • 我将 UDP 数据包(广播)从计算机(Windows)发送到运行 Unity 应用程序(三星 S7,android 6.0.1)的智能手机,它们连接到我使用 Unity 5.3.5p8 的同一个 wi-fi个人当我使用“游戏”选项卡对其进行测试时,它可以工作,我收到了数据包。我应该在 Windows 上禁用防火墙吗?
    • 首先,如果可能,请下载 Unity 5.4。他们修复了许多网络错误。简单地将Console.WriteLine 更改为Debug.Log 对我有用。你还是没有回答我的问题。该代码在编辑器中有效吗?您是否阅读了完整的答案?您是否尝试过我在回答中写的 Ip 192.168.1.255 内容?您不应该禁用防火墙。您应该让它允许某些应用程序从网络接收流量。你可以很容易地谷歌如何做到这一点
    • 好吧,我会尝试使用 unity 5.4。我更改了console.writeline -> debug.log,这让我看到它在编辑器中工作,如果你指的是统一游戏选项卡。我也试过IP 192.168.1.255,它并没有像我说的那样改变任何东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多