c# 异步处理 socket TCP转UDP服务

  //定义线程和连接对应数组

        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();
        }
————————————————
版权声明:本文为CSDN博主「幻辰科技(nbhctec)」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_38826167/article/details/91426913

猜你喜欢

转载自blog.csdn.net/kalvin_y_liu/article/details/128135992
今日推荐