using UnityEngine; using System.Net.Sockets; using System.Net; using System.Text; using System.Threading; using System; public class BroadcastServer : MonoBehaviour { private UdpClient udpBroadcaster; // 用于广播本地IP的UDP客户端 private Thread broadcastThread; // 运行广播循环的线程 private CancellationTokenSource cts = new CancellationTokenSource(); // 控制线程取消 private volatile bool isRunning = true; // 控制广播循环的线程安全标志 // 脚本启动时调用 void Start() { // 初始化UDP客户端并启用广播 udpBroadcaster = new UdpClient(); udpBroadcaster.EnableBroadcast = true; // 启动新线程以广播本地IP broadcastThread = new Thread(() => BroadcastIP(cts.Token)); broadcastThread.Start(); Debug.Log("显示端正在广播IP..."); } // 定期广播本地IP地址 private void BroadcastIP(CancellationToken token) { // 定义广播端点(IP: 255.255.255.255,端口: 9999) IPEndPoint endPoint = new IPEndPoint(IPAddress.Broadcast, 9999); string localIP = GetLocalIPAddress(); // 获取本地IPv4地址 // 在未取消的情况下持续广播 while (!token.IsCancellationRequested && isRunning) { try { // 将IP地址转换为字节并通过UDP发送 byte[] data = Encoding.UTF8.GetBytes(localIP); udpBroadcaster.Send(data, data.Length, endPoint); Thread.Sleep(2000); // 每2秒广播一次,减少网络负载 } catch (Exception ex) { Debug.LogError($"广播错误: {ex.Message}"); } } } // 获取本机的IPv4地址 private string GetLocalIPAddress() { string localIP = "127.0.0.1"; // 如果未找到有效IP,则回退到本地回环地址 foreach (var ip in Dns.GetHostEntry(Dns.GetHostName()).AddressList) { if (ip.AddressFamily == AddressFamily.InterNetwork) { localIP = ip.ToString(); // 使用找到的第一个IPv4地址 break; } } return localIP; } // 应用程序退出时清理资源 private void OnApplicationQuit() { isRunning = false; // 通知广播循环停止 cts.Cancel(); // 请求线程取消 udpBroadcaster?.Close(); // 关闭UDP客户端 if (broadcastThread != null && broadcastThread.IsAlive) { broadcastThread.Join(1000); // 等待线程结束,超时1秒 } } }