Example #1
0
        /// <summary>
        /// 侦听回调
        /// </summary>
        /// <param name="message">内容</param>
        /// <param name="srcip">发送者公网IP</param>
        /// <param name="srcport">发送者公网端口</param>
        private void ServerStartListener(string message, string srcip, string srcport)
        {
            UdpMessage        udpMessage = UdpMessage.GetUdpMessage(message);
            List <IPEndPoint> iPs        = new List <IPEndPoint>();
            Sender            udpSender  = new Sender();
            string            strinfo    = udpMessage.MessageContent;
            string            name       = udpMessage.UserName;
            string            desname    = udpMessage.Receiver;

            try
            {
                if (udpMessage.MessageType == MessageType.Control_Client)
                {
                    if (Regex.IsMatch(strinfo, "ConnectRequest(.*)"))
                    {
                        Match  match = Regex.Match(strinfo, "ConnectRequest(.*)");
                        string op    = match.Groups[1].Value.ToString();
                        User   user  = new User(name);
                        userHub.AddUser(user);
                        if (op == "Sender")
                        {
                            userHub.SetUserSendPoint(name, srcip, srcport);
                        }
                        else if (op == "Receiver")
                        {
                            userHub.SetUserReceivePoint(name, srcip, srcport);
                        }
                        else if (op == "LiveRecorder")
                        {
                            userHub.SetUserRecordPoint(name, srcip, srcport);
                        }
                        else if (op == "LivePlayer")
                        {
                            userHub.SetUserListenPoint(name, srcip, srcport);
                        }
                        UdpMessage msg   = new UdpMessage("ConnectResponse" + op, name, true);
                        Timer      timer = new Timer((state) =>
                        {
                            udpSender.Send(msg,
                                           (string)((object[])state)[0],
                                           (string)((object[])state)[1]
                                           );
                        }, new object[] { srcip, srcport }, 2000, 60000);
                    }
                    else if (strinfo == "Connect")
                    {
                        IPEndPoint iPEndPoint = GetReceiverOfUser(name);
                        if (iPEndPoint != null)
                        {
                            foreach (var i in userHub.GetUsers())
                            {
                                udpSender.Send("Onliner:" + i.Name, name, iPEndPoint);
                            }
                            udpSender.Send("ConnectSuccess", name, iPEndPoint);
                            Console.WriteLine(name + "已连接");
                        }
                    }
                    else if (strinfo == "DisConnect")
                    {
                        userHub.RemoveUser(name);
                        Console.WriteLine(name + "断开连接");
                    }
                    else if (Regex.IsMatch(strinfo, "RequestUserInfo:(.*)"))
                    {
                        #region A->B A端
                        IPEndPoint AiPEndPoint = GetReceiverOfUser(name);
                        Match      match       = Regex.Match(strinfo, "RequestUserInfo:(.*)");
                        string     requestName = match.Groups[1].Value.ToString();
                        string[]   ips         = GetAllAddrOfUser(requestName);
                        string     msg         = JsonConvert.SerializeObject(new object[] { requestName, ips });
                        udpSender.Send("ResponseUserInfo:" + msg, name, AiPEndPoint);
                        #endregion
                        #region A->B B端
                        IPEndPoint BiPEndPoint = GetReceiverOfUser(requestName);
                        udpSender.Send("BeReadyForCommunicate:" + name, requestName, BiPEndPoint);
                        #endregion
                    }
                    else if (Regex.IsMatch(strinfo, "ReadyToVoiceCommunicate:(.*)"))
                    {
                        #region A->B A端
                        Match  match       = Regex.Match(strinfo, "ReadyToVoiceCommunicate:(.*)");
                        string requestName = match.Groups[1].Value.ToString();
                        #endregion
                        #region A->B B端
                        IPEndPoint BiPEndPoint = GetReceiverOfUser(requestName);
                        udpSender.Send("ReadyToVoiceCommunicate:" + name, requestName, BiPEndPoint);
                        #endregion
                    }
                    else if (Regex.IsMatch(strinfo, "BPlayToARecHoleOpened:(.*)"))
                    {
                        #region A->B B端
                        Match  match       = Regex.Match(strinfo, "BPlayToARecHoleOpened:(.*)");
                        string requestName = match.Groups[1].Value.ToString();
                        #endregion
                        #region A->B A端
                        IPEndPoint AiPEndPoint = GetReceiverOfUser(requestName);
                        udpSender.Send("BPlayToARec:" + name, requestName, AiPEndPoint);
                        #endregion
                    }
                    else if (Regex.IsMatch(strinfo, "APlayToBRecHoleOpened:(.*)"))
                    {
                        #region A->B A端
                        Match  match       = Regex.Match(strinfo, "APlayToBRecHoleOpened:(.*)");
                        string requestName = match.Groups[1].Value.ToString();
                        #endregion
                        #region A->B B端
                        IPEndPoint BiPEndPoint = GetReceiverOfUser(requestName);
                        udpSender.Send("APlayToBRec:" + name, requestName, BiPEndPoint);
                        #endregion
                    }
                    else if (Regex.IsMatch(strinfo, "EndVoice:(.*)"))
                    {
                        Match      match       = Regex.Match(strinfo, "EndVoice:(.*)");
                        string     requestName = match.Groups[1].Value.ToString();
                        IPEndPoint BiPEndPoint = GetReceiverOfUser(requestName);
                        udpSender.Send("EndVoice", name, BiPEndPoint);
                    }
                }
                else if (udpMessage.MessageType == MessageType.Communicate)
                {
                    udpSender.Send(udpMessage, GetReceiverOfUser(desname));
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }
Example #2
0
 /// <summary>
 /// 接收端口信息并处理
 /// </summary>
 /// <param name="message">信息</param>
 private void callBack(string message)
 {
     try
     {
         bool       isVoice    = false;
         UdpMessage udpMessage = UdpMessage.GetUdpMessage(message);
         string     content    = udpMessage.MessageContent;
         if (udpMessage.MessageType == MessageType.Control_Server)
         {
             if (content == "ConnectSuccess")
             {
                 setObj(connectStatusLabel, "连接成功");
                 setObj(functionPanel, true);
             }
             else if (content == "EndVoice")
             {
                 voiceForm.End();
             }
             else if (Regex.IsMatch(content, "Onliner:(.*)"))
             {
                 string name = Regex.Match(content, "Onliner:(.*)").Groups[1].Value.ToString();
                 if ((!onliner.Contains(name)) && (name != user.UserName))
                 {
                     onliner.Add(name);
                 }
                 setObj(onlineUsersComboBox, onliner);
             }
             else if (Regex.IsMatch(content, "ResponseUserInfo:(.*)"))
             {
                 string   Info        = Regex.Match(content, "ResponseUserInfo:(.*)").Groups[1].Value.ToString();
                 object[] objs        = JsonConvert.DeserializeObject <object[]>(Info);
                 string   requestName = objs[0].ToString();
                 string[] ips         = JsonConvert.DeserializeObject <string[]>(objs[1].ToString());
                 foreach (var i in ips)
                 {
                     IPEndPoint ip = new IPEndPoint(IPAddress.Parse(i.Split("|")[1]), int.Parse(i.Split("|")[3]));
                     connectIPs.Add(ip);
                 }
                 setObj(onlineUsersComboBox, false);
                 setObj(communicateButton, false);
                 setObj(communicatePanel, true);
                 if (isVoice)
                 {
                     isVoice = false;
                     if (connectIPs.Count == 4)
                     {
                         voiceForm = new VoiceForm(user, connectIPs, requestName, true);
                         voiceForm.ShowDialog();
                     }
                 }
             }
             else if (Regex.IsMatch(content, "BeReadyForCommunicate:(.*)"))
             {
                 string fromName = Regex.Match(content, "BeReadyForCommunicate:(.*)").Groups[1].Value.ToString();
                 setObj(onlineUsersComboBox, fromName);
                 setObj(onlineUsersComboBox, false);
                 setObj(communicateButton, false);
                 setObj(communicatePanel, true);
             }
             else if (Regex.IsMatch(content, "ReadyToVoiceCommunicate:(.*)"))
             {
                 string fromName = Regex.Match(content, "ReadyToVoiceCommunicate:(.*)").Groups[1].Value.ToString();
                 setObj(onlineUsersComboBox, fromName);
                 setObj(onlineUsersComboBox, false);
                 _sender.Send("RequestUserInfo:" + fromName);
                 isVoice = true;
             }
             else if (Regex.IsMatch(content, "BPlayToARec:(.*)"))
             {
                 string BName = Regex.Match(content, "BPlayToARec:(.*)").Groups[1].Value.ToString();
                 setObj(onlineUsersComboBox, BName);
                 setObj(onlineUsersComboBox, false);
                 voiceForm.ReadyToRecord(connectIPs);
             }
             else if (Regex.IsMatch(content, "APlayToBRec:(.*)"))
             {
                 string AName = Regex.Match(content, "APlayToBRec:(.*)").Groups[1].Value.ToString();
                 setObj(onlineUsersComboBox, AName);
                 setObj(onlineUsersComboBox, false);
                 voiceForm.BPlayer(connectIPs);
             }
         }
         else if (udpMessage.MessageType == MessageType.Communicate)
         {
             string showContent = udpMessage.Receiver + "\t" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\n" + content + "\n";
             setObj(showContentRichTextBox, showContent, true);
         }
         else if (udpMessage.MessageType == MessageType.Control_Client)
         {
             if (content == "BPlayToARec")
             {
             }
         }
     }
     catch (ThreadAbortException e)
     {
         Console.WriteLine("线程终止");
         Console.WriteLine(e.Message);
     }
     catch (Exception e)
     {
         Console.WriteLine("error!!");
         Console.WriteLine(e.Message);
     }
 }