Пример #1
0
        /// <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;
            }
        }
Пример #2
0
        /// <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;
            }
        }
Пример #3
0
        /// <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);
            }
        }
Пример #4
0
        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);
            }
        }
Пример #5
0
        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);
        }
Пример #6
0
 protected virtual void OnUdpPacketArrived(UdpPacketArrivedEventArgs e)
 {
     this.UdpPacketArrived?.Invoke(this, e);
 }