Beispiel #1
0
        /// <summary>
        /// 发送数据
        /// </summary>
        /// <param name="pid"></param>
        /// <param name="command"></param>
        /// <param name="data"></param>
        /// <returns></returns>
        private SocketRespons SendData(int pid, Command command, object data = null)
        {
            if (!userConnections.ContainsKey(pid))
            {
                throw new Exception("当前微信Id不在线。");
            }
            SocketRespons respons = null;
            string        key     = Guid.NewGuid().ToString();

            JObject obj = null;

            if (data != null)
            {
                obj = QNSerialize.DeserializeObject <JObject>(QNSerialize.SerializeObject(data));
            }
            else
            {
                obj = new JObject();
            }

            obj.Add("Code", (int)command);
            obj.Add("Callback", key);
            var encode = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(obj.ToString()));

            userConnections[pid].Connection.Send(encode);

            AutoResetEvent returnWaitSignal = new AutoResetEvent(false);
            ResponsHandlerCallBackDelegate SendReceiveDelegate = (result) =>
            {
                respons = result;
                returnWaitSignal.Set();
            };

            AppendIncomingPacketHandler(key, SendReceiveDelegate);
            if (!returnWaitSignal.WaitOne(30 * 1000))//三十秒超时
            {
                RemoveIncomingPacketHandler(key, SendReceiveDelegate);
                throw new QNException(26, "请求超时。", null);
            }
            RemoveIncomingPacketHandler(key, SendReceiveDelegate);
            if (respons.Error != 0)
            {
                throw new QNException((uint)respons.Error, respons.Message);
            }
            return(respons);
        }
Beispiel #2
0
        private void WeChat_WeChatInitEvent(object sender, WeChat.Events.WeChatInitArgs e)
        {
            pid = e.PorcessId;
            ShowLog($"[日志]{e.Message}");
            while (!WeChat.CheckLoginState(e.PorcessId))
            {
                Thread.Sleep(1000);
            }
            var user = WeChat.GetLoginUser(e.PorcessId);

            if (user != null)
            {
                this.Dispatcher.BeginInvoke((Action) delegate()
                {
                    tb_UserInfo.Text  = QNSerialize.SerializeObject(user);
                    lb_Status.Content = "已登录";
                });
            }
            this.Dispatcher.BeginInvoke((Action) delegate()
            {
                Contacts.Clear();
            });
            WeChat.GetContactList(pid);
        }
Beispiel #3
0
        private void Receive(IWebSocketConnection connection, string message)
        {
            try
            {
                var temp = System.Text.Encoding.UTF8.GetString(Convert.FromBase64String(message));
                if (string.IsNullOrEmpty(temp))
                {
                    return;
                }
                var respons = QNSerialize.DeserializeObject <SocketRespons>(temp);

                switch ((Command)respons.Code)
                {
                case Command.Cmd_Init:
                    UserConnection user = new UserConnection();
                    user.Connection = connection;
                    user.ProcessId  = respons.Pid;
                    lock (_lock)
                    {
                        if (userConnections.ContainsKey(respons.Pid))
                        {
                            userConnections[respons.Pid] = user;
                        }
                        else
                        {
                            userConnections.Add(respons.Pid, user);
                        }
                    }
                    WeChatInitEvent?.Invoke(connection, new WeChatInitArgs()
                    {
                        Error = respons.Error, IsSuccess = respons.Error == 0, Message = respons.Message, PorcessId = respons.Pid
                    });
                    break;

                case Command.Cmd_ReceiveMessage:
                    HandlerMessage(connection, respons);
                    break;

                case Command.Cmd_GetUser:
                    ReceiveLoginUser(connection, respons);
                    break;

                case Command.Cmd_ContactList:
                    ReceiveContactEvent?.Invoke(connection, respons.Data?.ToObject <Contact>());
                    break;

                default:
                    List <ResponsHandlerCallBackDelegate> delegates;
                    if (incomingResponsHandlers.TryGetValue(respons.Callback, out delegates))
                    {
                        if (delegates != null && delegates.Count > 0)
                        {
                            delegates[0](respons);
                        }
                    }
                    break;
                }
            }
            catch (Exception ex)
            {
                QNLog.WriteError("Receive", ex, "解析消息通信数据失败");
            }
        }
Beispiel #4
0
 /// <summary>
 /// 发送数据
 /// </summary>
 /// <param name="pid"></param>
 /// <param name="data"></param>
 private void SendData(int pid, object data)
 {
     if (!userConnections.ContainsKey(pid))
     {
         throw new Exception("当前微信Id不在线。");
     }
     userConnections[pid].Connection.Send(Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(QNSerialize.SerializeObject(data))));
 }