/// <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()); } }
/// <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); } }