在 Unity 中使用两个相同的脚本时 UDP 行为出错

UDP behavior goes wrong when using two identical scripts in Unity

我将以下两个脚本附加到一个游戏对象。

using UnityEngine;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;

public class TestScript : MonoBehaviour
{
    static UdpClient udp;
    private string udp_message = "";
    Thread thread;
    public int port = 8888;

    void Start()
    {
        udp = new UdpClient(port);

        thread = new Thread(new ThreadStart(ThreadMethod));
        thread.Start();
    }

    // Update is called once per frame
    void Update()
    {
        string port_string = port.ToString();
        Debug.Log(port_string + ":" + udp_message);
    }

    void ThreadMethod()
    {
        while (true)
        {
            try
            {
                IPEndPoint remoteEP = null;
                byte[] data = udp.Receive(ref remoteEP);
                udp_message = Encoding.ASCII.GetString(data);
            }
            catch
            {
            }
        }
    }
}

然后,我用8888作为一个脚本的端口,如下图所示。另一个脚本使用端口 8889.

我在 8888 和 8889 上使用两个不同的端口。

但是,当我只向8888端口发送数据时,8889端口上的UDP似乎也有响应。

这是什么原因?

我该如何解决?

你的 udp 字段是 static!

您的组件的两个实例都用

中的不同引用覆盖它
udp = new UdpClient(port);

所以基本上最后运行的脚本“获胜”,你只会使用那个 UdpClient 实例。

稍后您的两个线程将访问完全相同的 udp 引用以执行

udp.Receive(...);

干脆不让你场static你应该没问题^^

private UdpClient udp;

还有你空的 catch 块......我至少会做到

catch(Exception e)
{
    Debug.LogException(e);
}

在控制台中显示错误但不会中断线程。


然后一定要清理干净!

private void OnDestroy()
{
    thread?.Abort();
    udp?.Dispose();
}

否则您可能会遇到僵尸线程或阻塞的 UDP 端口 ;)