AnimalSimulation/Assets/Scripts/BroadcastServer.cs

79 lines
2.4 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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秒
}
}
}