使用此方法有助于udp在局域网内稳定的连接运行,已经过验证,为了保持彻底的稳定,可以考虑加入ping-pang进行网络处理,如果为了安全,请使用加密TCP
如果您要在大规,大项目的游戏中使用网络技术,建议您使用:mirror,请仔细阅读下代码再进行修改,它的网络构成比较完善,但可能不太适合您的项目,仅供参考
mirror 使用比较完善的kcp技术,如果您想要了解kcp请进行网络搜索,非常建议您访问:github进行学习
public class NetSever : GloabManager
{private static NetSever _instance;public static NetSever Instance{get{if (_instance == null)_instance = new NetSever();return _instance;}}public int connectPort;//private Socket socket;private EndPoint clientEnd;private Thread connectThread;public string hostIp = null;public Action UI_OutlinemodeData_GameOver;public Text YuYinShiBie;public Text IP;public bool capture;public bool ColorData = false;public int PlayID;public Queue LogQueue = new Queue();UdpClient udpClient;IPEndPoint ipEnd;public override void Start(){base.Start();//初始化协议if (GetIP() == ""){Debug.LogError("当前IP地址不存在,或没有信号进行连接!");return;}udpClient = new UdpClient();udpClient.EnableBroadcast = true;connectPort = 6000;开启一个线程connectThread = new Thread(new ThreadStart(SocketReceive));Thread.Sleep(1000);connectThread.Start();//SendAllStart("Start+90");}public override void Update(){base.Update();SendMessanger();}string GetIP(){//本机名 string hostName = Dns.GetHostName();//会返回所有地址,包括IPv4和IPv6IPAddress[] addressList = Dns.GetHostAddresses(hostName);foreach (IPAddress ip in addressList){if (ip.AddressFamily == AddressFamily.InterNetwork){return ip.ToString();}}return "127.0.0.1";}void SocketReceive(){UdpClient udpClient = new UdpClient(connectPort);try{Debug.Log("Listening for port " + connectPort + ":" + GetIP());IPEndPoint remoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);while (true){byte[] recvData = udpClient.Receive(ref remoteIpEndPoint);string recvStr = Encoding.UTF8.GetString(recvData);LogQueue.Enqueue(recvStr);Debug.LogError(recvStr);}}catch (Exception){throw;}finally{udpClient.Close();}}void SendMessanger(){if (LogQueue.Count <= 0) return;string strArray = LogQueue.Dequeue() as string;//注意:此处向下处理数据,请结合项目实际if (strArray.Contains("+")){var _str = strArray.Split('+');if (_str[0] != string.Empty){switch (_str[0]){}}}else{Debug.LogError("收到的信息不正确");}}public void SendAllStart(string content){byte[] bytes = Encoding.UTF8.GetBytes(content);udpClient.Send(bytes, bytes.Length, new IPEndPoint(IPAddress.Broadcast, connectPort));}
}