//定义线程和连接对应数组
Dictionary<string, Socket> dictSocket = new Dictionary<string, Socket>();
Dictionary<string, Thread> dictThread = new Dictionary<string, Thread>();
/// <summary>
/// 开启服务器
/// </summary> public void StartServer()
{
socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ip = Dns.Resolve(Dns.GetHostName()).AddressList[0]; //获得本地电脑ip
//IPEndPoint endPoint = new IPEndPoint(ip , 0228);
IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("192.168.188.22"), 0228);
try
{
socketWatch.Bind(endPoint);
}
catch (SocketException se)
{
Console.WriteLine(se);
sockConnection.Close();
return;
}
socketWatch.Listen(10000);
threadWatch = new Thread(WatchConnecting);
threadWatch.IsBackground = true;
threadWatch.Start();
}
/// <summary>
/// 判断多少个客户端进行连接
/// </summary>
void WatchConnecting()
{
while (true)
{
sockConnection = socketWatch.Accept();
ClientIp = sockConnection.RemoteEndPoint.ToString();//获得用户连接的ip
dictSocket.Add(ClientIp, sockConnection);
// Console.WriteLine("客户端连接成功 :" + ClientIp + " : " + dictSocket.Count);
Thread thr = new Thread(RecMsg);
thr.IsBackground = true;
thr.Start(sockConnection);
dictThread.Add(ClientIp, thr);
}
}
/// <summary>
/// 接收消息
/// </summary>
/// <param name="sokConnectionparn"></param>
void RecMsg(object sokConnectionparn)
{
Socket sokClient = sokConnectionparn as Socket;
while (true)
{
//定义一个2M的缓存区;
byte[] arrMsgRec = new byte[1024 * 1024 * 2];
//将接受到的数据存入到输入 arrMsgRec中;
int length = -1;
try
{
length = sokClient.Receive(arrMsgRec); // 接收数据,并返回数据的长度;
if (length == 0)
{
dictSocket.Remove(sokClient.RemoteEndPoint.ToString());
dictThread.Remove(sokClient.RemoteEndPoint.ToString());
}
if (length <= 1)
{
dictSocket.Remove(sokClient.RemoteEndPoint.ToString());
dictThread.Remove(sokClient.RemoteEndPoint.ToString());
//Console.WriteLine("1 : " + dictSocket.Count);
break;
}
}
catch (SocketException se)
{
dictSocket.Remove(sokClient.RemoteEndPoint.ToString());
dictThread.Remove(sokClient.RemoteEndPoint.ToString());
// Console.WriteLine(dictSocket.Count + " : " + sokClient.RemoteEndPoint.ToString());
sokClient.Close();
break;
}
catch (Exception e)
{
dictSocket.Remove(sokClient.RemoteEndPoint.ToString());
dictThread.Remove(sokClient.RemoteEndPoint.ToString());
sokClient.Close();
break;
}
if (arrMsgRec[0] == 0) // 表示接收到的是数据;
{
string strMsg = System.Text.Encoding.UTF8.GetString(arrMsgRec, 1, length - 1);
Analysis(strMsg, sokClient); //数据解析
}
if (arrMsgRec[0] == 1) //表示是文件
{
}
}
Thread.Sleep(100);
}
/// <summary>
/// 解析指令字符串
/// </summary>
/// <param name="_socket">客户端</param>
/// <param name="_message">数据</param>
void Analysis(string message, Socket socket)
{
if (message.Contains("FGKJ6") != false)
{
recData = message.Replace("\n", "");
int i = message.IndexOf("FGKJ6");
recData = recData.Substring(0, i + 5);
SetVoice(recData, socket);
SetStartApp(socket, recData);
UDP_Send(socket, recData); //通过udp转发数据
}
}
/// <summary>
/// 发送消息
/// </summary>
/// <param name="_socket">客户端</param>
/// <param name="_message">数据</param>
public void SendServer(Socket _socket, string _message)
{
byte[] arrMes = Encoding.UTF8.GetBytes(_message);
byte[] arrSendMsfg = new byte[arrMes.Length + 1];
arrSendMsfg[0] = 0;
Buffer.BlockCopy(arrMes, 0, arrSendMsfg, 1, arrMes.Length);
_socket.Send(arrSendMsfg);
}
void UDP_Send(Socket socket, string recData)
{
//暂停
if (recData.Contains("Stops"))
{
string Class = recData.Replace("Stops", "").Replace("FGKJ6", "");
//判断程序中是否存在该程序
if (System.Diagnostics.Process.GetProcessesByName(Class).ToList().Count > 0)
{
UdpSendUnity("HttpUdpPauseFGKJS"); //发到unity内容中
}
else
{
SendServer(socket, "程序不在运行中!");
}
}
//继续
if (recData.Contains("Plays"))
{
string Class = recData.Replace("Plays", "").Replace("FGKJ6", "");
//判断程序中是否存在该程序
if (System.Diagnostics.Process.GetProcessesByName(Class).ToList().Count > 0)
{
UdpSendUnity("HttpUdpContinueFGKJS"); //发到unity内容中
}
else
{
SendServer(socket, "程序不在运行中!");
}
}
//退出与关闭
if (recData.Contains("Close"))
{
string Class = recData.Replace("Close", "").Replace("FGKJ6", "");
if (System.Diagnostics.Process.GetProcessesByName(Class).ToList().Count > 0)
{
KillApplications(Class); //并且再次干掉
UdpSendUnity("HttpUdpProgramQuitFGKJS"); //发到unity内容中
}
else
{
SendServer(socket, "程序不在运行中!");
KillApplications(Class); //并且再次干掉
}
}
//单个显示
if (recData.Contains("Single1"))
{
string Class = recData.Replace("Single1", "").Replace("FGKJ6", "");
//判断程序中是否存在该程序
if (System.Diagnostics.Process.GetProcessesByName(Class).ToList().Count > 0)
{
UdpSendUnity("HttpUdpSingle1FGKJS"); //发到unity内容中
}
else
{
SendServer(socket, "程序不在运行中!");
}
}
//全屏展示
if (recData.Contains("Whole3"))
{
string Class = recData.Replace("Whole3", "").Replace("FGKJ6", "");
//判断程序中是否存在该程序
if (System.Diagnostics.Process.GetProcessesByName(Class).ToList().Count > 0)
{
UdpSendUnity("HttpUdpWhole3FGKJS"); //发到unity内容中
}
else
{
SendServer(socket, "程序不在运行中!");
}
} }
/// <summary>
/// 发送到unity3D中
/// </summary>
/// <param name="recData"></param>
void UdpSendUnity(string recData)
{
byte[] bytes = new byte[1024 * 2];
IPEndPoint ip = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 19950);
Socket socketUdp = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
EndPoint ep = (EndPoint)ip;
bytes = Encoding.Unicode.GetBytes(recData);
socketUdp.SendTo(bytes, ep);
socketUdp.Close();
}