79 lines
2.4 KiB
C#
79 lines
2.4 KiB
C#
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秒
|
||
}
|
||
}
|
||
} |