/*--------------------------------------------------
* // 文件功能描述: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
}