/// <summary> /// 服务端收到数据 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void AsyncNetUdpServer_UdpPacketArrived(object sender, UdpPacketArrivedEventArgs e) { String dataJson = AesEncrypt.Decrypt(Program.AppSettings.ControlKey, e.PacketData).TrimEnd('\0'); Program.Logger.Log("UdpSocketServer", $"UdpPacketArrived=>{e.RemoteEndPoint.Address}:{e.RemoteEndPoint.Port}=>{dataJson}"); if (String.IsNullOrWhiteSpace(dataJson) || dataJson.IndexOf("ActionId") < 0 || dataJson.IndexOf("ActionName") < 0) { this.AsyncNetUdpServer.Post($"UnknownDataPacket,Logged\"{e.RemoteEndPoint.Address}:{e.RemoteEndPoint.Port}\"".GetBytes_Utf8(), e.RemoteEndPoint); return; } Entity.UdpSocketPacketRecive packet = null; try { packet = JsonConvert.DeserializeObject <Entity.UdpSocketPacketRecive>(dataJson); } catch {} if (packet == null) { this.AsyncNetUdpServer.Post($"UnknownDataPacket,Logged\"{e.RemoteEndPoint.Address}:{e.RemoteEndPoint.Port}\"".GetBytes_Utf8(), e.RemoteEndPoint); return; } switch (packet.ActionId) { case 1: this.PacketAction1(e.RemoteEndPoint); break; case 2: this.PacketAction2(e.RemoteEndPoint); break; case 1001: this.PacketAction1001(e.RemoteEndPoint); break; case 1002: this.PacketAction1002(e.RemoteEndPoint); break; case 1003: this.PacketAction1003(e.RemoteEndPoint, packet); break; case 1004: this.PacketAction1004(e.RemoteEndPoint); break; case 1005: this.PacketAction1005(e.RemoteEndPoint, packet); break; } }
/// <summary> /// 套接字接收数据 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void AsyncNetUdpClient_UdpPacketArrived(object sender, UdpPacketArrivedEventArgs e) { this.ViewModel.ByteRecv += e.PacketData.Length; if (!Helper.AesEncrypt.Decrypt(this.ViewModel.Key, e.PacketData, out String s1)) { this.ViewModel.OutputString = $"套接字接收数据=>无法解析"; return; } String json = s1.TrimEnd('\0'); this.ViewModel.OutputString = $"套接字接收数据=>{json}"; dynamic d1 = Newtonsoft.Json.JsonConvert.DeserializeObject(json); if (d1.ActionId == null || d1.ActionId < 1 || d1.ErrorCode == null || d1.ErrorCode > 0) { return; } switch ((Int32)d1.ActionId) { case 1: this.Connected = true; this.ViewModel.Window.Dispatcher.InvokeAsync(() => { System.Windows.Input.CommandManager.InvalidateRequerySuggested(); }); break; case 1001: this.ViewModel.OutputString = "指令已完成=>FetchUnits"; break; case 1002: this.ViewModel.OutputString = "指令已完成=>StartAllUnits"; break; case 1003: this.ViewModel.OutputString = "指令已完成=>StartUnit"; break; case 1004: this.ViewModel.OutputString = "指令已完成=>StopAllUnits"; break; case 1005: this.ViewModel.OutputString = "指令已完成=>StopUnit"; break; } }
/// <summary> /// 通过心跳把客户端的通信IP和端口号存入数据库,然后有新消息的时候就发送 /// </summary> /// <param name="e"></param> private void UdpPacketArrive(UdpPacketArrivedEventArgs e) { try { string msg = Encoding.UTF8.GetString(e.PacketData); var m = JsonConvert.DeserializeObject <MessageModel>(msg); //判断用户是否已经登录 if (!IsLogin(m.FromUid)) { return; } //获取我的消息 GetMyMsg(m.FromUid, m.ToUid, e); //如果不是心跳包则新消息入库并立即发送 if (!m.Msg.Equals("heart")) { //入库并响应客户端 ResponseToClientIfMsgSendSuccess(SaveMsg(m), m.id, e); //立即把消息发给朋友 SendMsg(m); } else { //更新通信IP、端口 UserInfoBLL.UpdateUdpEndPoint(e.RemoteEndPoint.Address.ToString(), e.RemoteEndPoint.Port, m.FromUid); } } catch (Exception ex) { Console.WriteLine(ex.StackTrace + ex.Message); } }
private void GetMyMsg(string fromuid, string touid, UdpPacketArrivedEventArgs e) { var dtMsg = MessagesBLL.GetMessages(fromuid, touid); if (dtMsg != null && dtMsg.Rows.Count > 0) { var jsonMsg = JsonConvert.SerializeObject(dtMsg); mUdpServer.Post(Encoding.UTF8.GetBytes(jsonMsg), e.RemoteEndPoint); } }
private void ResponseToClientIfMsgSendSuccess(bool v, string id, UdpPacketArrivedEventArgs e) { string flat = "fail"; if (v) { flat = "ok"; } var msgModel = new MessagesModel { id = id, msg = flat, read_state = -99//标志这条消息是系统自动发送,是判断客户端的消息是否成功发送的标志 }; var list = new List <MessagesModel> { msgModel }; var jsonMsg = JsonConvert.SerializeObject(list); mUdpServer.Post(Encoding.UTF8.GetBytes(jsonMsg), e.RemoteEndPoint); }
protected virtual void OnUdpPacketArrived(UdpPacketArrivedEventArgs e) { this.UdpPacketArrived?.Invoke(this, e); }