您的位置:首页 > 其它

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

}








                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: