在 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 端口 ;)
我将以下两个脚本附加到一个游戏对象。
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 端口 ;)