using System; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; namespace BITKit.Net.LAN { /// /// 基于UDP的LAN广播 /// public class UdpBasedLanBroadcaster : ILANBroadcaster { public int Port { get; set; } public byte[] Buffer { get; set; } = StringHelper.GetBytes("Hello World"); private bool _isBroadcasting; private bool _isListening; public UdpBasedLanBroadcaster() { } public event Action OnReceive; public void StartBroadcast() { _isBroadcasting = true; Thread thread = new(Process) { IsBackground = true }; thread.Start(); BIT4Log.Log($"开始广播端口{Port}"); } public void StopBroadcast() { _isBroadcasting = false; BIT4Log.Log($"停止广播端口 {Port}"); } public void StartListen() { _isListening = true; var thread = new Thread(ReceiveThread) { IsBackground = true }; thread.Start(); BIT4Log.Log($"开始监听端口:{Port}"); } public void StopListen() { _isListening = false; BIT4Log.Log($"停止监听端口{Port}"); } private void Process() { var udpClient = new UdpClient(new IPEndPoint(IPAddress.Any, 0)); var endpoint = new IPEndPoint(IPAddress.Broadcast, Port); //其实 IPAddress.Broadcast 就是 255.255.255.255 //下面代码与上面有相同的作用 //IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse("255.255.255.255"), 8080); try { while (_isBroadcasting) { udpClient.Send(Buffer, Buffer.Length, endpoint); Thread.Sleep(1000); } } catch (Exception e) { BIT4Log.LogException(e); } udpClient.Dispose(); } private void ReceiveThread() { try { var udpClient = new UdpClient(new IPEndPoint(IPAddress.Any, Port)); var endpoint = new IPEndPoint(IPAddress.Any, 0); while (_isListening) { var buf = udpClient.Receive(ref endpoint); var msg = Encoding.Default.GetString(buf); if (OnReceive is not null) OnReceive(endpoint, msg); else BIT4Log.Log($"Receive From {endpoint}:\t{msg}"); Thread.Sleep(500); } } catch (Exception e) { BIT4Log.LogException(e); } } } }