UDP局域网广播实现CS房间列表
2017-06-20 17:52
281 查看
/*-------------------------------------------------- * // 文件功能描述:UDP广播IP地址。实现类似CS的局域网房间列表 ---------------------------------------------------*/ using UnityEngine; using System.Collections; using UnityEngine.Networking; using System.Threading; using System.Collections.Generic; using System.Net; using System.Text; using UnityEngine.UI; using System.Net.Sockets; using System; using System.Net.NetworkInformation; public class JuYuWangBroadCast : MonoBehaviour { #region private int bcPort = 7788;//广播端口 private string curIp;//当前PC的Ip private Thread sendThread; private Thread rcvThread; private bool isSendTdStart = false; private bool isRcvTdStart = false; public List<string> serverList = new List<string>();//接收到的服务器列表 public List<int> ipTimeList = new List<int>();//Ip计时列表,通过IP该值可知该ip是否有效 public List<int> unValIpList = new List<int>();//无效的服务器索引 private int curServerCount; private bool isServerCountChange = false; string msg = "";//发出去的信息 string rcvMsg = ""; string showStr = ""; //public Text msgText; public bool isServer = false; private UdpClient client1; private UdpClient client2; private StringBuilder sBuilder; private UFE ufe; private string tempIp; private float delTime = 2; private float delTimer = 0; void Start() { Init(); } void Update() { delTimer += Time.deltaTime; if (delTimer > delTime) { delTimer = 0; //清理无效的Ip ClearUnValidIp(); } } //清理无效的Ip private void ClearUnValidIp() { //for (int i = 0; i < ipTimeList.Count; i++) //{ // if (ipTimeList[i] < valTimer - serverList.Count*900 || ipTimeList[i] > valTimer + serverList.Count * 900) // { // unValIpList.Add(i); // } //} for (int i = 0; i < ipTimeList.Count; i++) { if (ipTimeList[i] == 0) { unValIpList.Add(i); } else { ipTimeList[i] = 0; } } for (int j = unValIpList.Count - 1; j >= 0; j--) { Debug.Log("存在无效ip"); serverList.RemoveAt(unValIpList[j]); ipTimeList.RemoveAt(unValIpList[j]); } unValIpList.Clear(); } private void ClearServerList() { serverList.Clear(); } //得到局域网内所有的服务器列表 public List<string> GetServerList() { return serverList; } private void Init() { sBuilder = new StringBuilder(); ufe = Camera.main.GetComponent<UFE>(); System.Net.IPHostEntry myEntry = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()); curIp = myEntry.AddressList[0].ToString(); serverList.Clear(); isServerCountChange = false; //监听端口看是否有PC发信息过来 if (null == rcvThread) { isRcvTdStart = true; rcvThread = new Thread(new ThreadStart(RcvMsg)); rcvThread.IsBackground = true; rcvThread.Start(); } //向内网其他人发信息 if (null == sendThread) { isSendTdStart = true; sendThread = new Thread(new ThreadStart(SendMsg)); sendThread.IsBackground = true; sendThread.Start(); } } int timerr = 0; private void RcvMsg() { client1 = new UdpClient(new IPEndPoint(IPAddress.Any, bcPort)); IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 0); while (isRcvTdStart) { //Debug.Log("1"); byte[] bytes = client1.Receive(ref endPoint); rcvMsg = Encoding.Default.GetString(bytes); if (string.IsNullOrEmpty(rcvMsg)) { // Debug.Log("接收到的数据为null"); // msgText.text = "未收到其他主机发来的消息"; } else { if (!rcvMsg.Contains("-") || rcvMsg.Contains(curIp))//收到的消息来自其他客户端或当前客户端 { // Debug.Log("接收到了客户端" + rcvMsg + "的消息"); //continue; } else { string[] rcvArray = rcvMsg.Split('-'); for (int i = 0; i < serverList.Count; i++) { if (serverList[i].StartsWith(rcvArray[1])) { ipTimeList[i]++; } } //rcvMsg = rcvArray[1] + "-" + rcvArray[2]; sBuilder.Append(rcvArray[1]); sBuilder.Append("-"); sBuilder.Append(rcvArray[2]); rcvMsg = sBuilder.ToString(); sBuilder.Remove(0, sBuilder.Length); if (rcvArray[0] == "S")//接收到的是服务器的Ip { //Debug.Log(serverList[0]); //Debug.Log(rcvMsg); if (!serverList.Contains(rcvMsg)) { serverList.Add(rcvMsg); ipTimeList.Add(10); if (ipTimeList.Count > serverList.Count) { ipTimeList.RemoveRange(serverList.Count, ipTimeList.Count - 1); } } } } } } } int timer = 0; private void SendMsg() { client2 = new UdpClient(new IPEndPoint(IPAddress.Any, 0)); IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("255.255.255.255"), bcPort);//IPAddress.Parse("255.255.255.255") IPAddress.Any while (isSendTdStart) { //Debug.Log("2"); if (isServer) { //msg = "S-" + curIp + "-1"; sBuilder.Append("S"); sBuilder.Append("-"); sBuilder.Append(curIp); sBuilder.Append("-"); sBuilder.Append(1);//Network.connections.Length + 1 (ufe.curNetNum).ToString() msg = sBuilder.ToString(); sBuilder.Remove(0, sBuilder.Length); } else { msg = curIp; } byte[] bytes = Encoding.Default.GetBytes(msg); //timer++; //if (timer > 2000)//2000 //{ // timer = 0; client2.Send(bytes, bytes.Length, endPoint); Thread.Sleep(100); //} } } public void CloseThreadBtn() { KillThread(); } //关闭线程 private void KillThread() { //Debug.Log("kill thread"); isServer = false; client1.Close(); client2.Close(); if (null != sendThread) { isSendTdStart = false; sendThread.Abort(); } if (null != rcvThread) { isRcvTdStart = false; rcvThread.Abort(); } } void OnApplicationQuit() { KillThread(); } void OnDestroy() { KillThread(); } #endregion }
相关文章推荐
- oc下实现局域网udp广播通讯使用开源框架GCDAsyncUdpSocket
- C#实现局域网UDP广播------C#网络编程杂记[1]
- java UDP实现局域网广播
- java UDP实现局域网广播
- java UDP实现局域网广播
- udp广播局域网传送消息的实现
- Unity中运用UDP广播服务器IP实现局域网联机
- C#实现局域网UDP广播
- C#实现局域网UDP广播------C#网络编程杂记[1]
- 通过UDP广播实现Android局域网Peer Discovering
- 通过UDP广播实现Android局域网Peer Discovering
- 【代码练习8】UDP协议实现局域网屏幕广播功能
- C#实现局域网UDP广播--
- Android编程实现基于局域网udp广播自动建立socket连接的方法
- python+soket实现UDP协议的局域网广播程序
- 使用udp广播实现简单局域网群聊
- C#实现局域网UDP广播
- Python+Socket实现基于UDP协议的局域网广播功能示例
- Socket API实现UDP广播
- udp 局域网广播发送代码