Example #1
0
        //处理登录反馈消息
        private static void HandleLoginResult(JObject head, byte[] data)
        {
            //提取结果包头
            ResultHead resultHead = GetResultHead(head);

            //发起登录完成事件
            if (head[AttrNames.Error].ToString() != "")
            {
                OnLoginDone?.Invoke(resultHead, null);
                return;
            }
            User user = new User
            {
                Name     = head[AttrNames.User].ToString(),
                NickName = head[AttrNames.NickName].ToString(),
                Motto    = head[AttrNames.Motto].ToString(),
                Group    = (UserGroup)Enum.Parse(typeof(UserGroup), head[AttrNames.UGroup].ToString()),
                Photo    = User.DefaultPhoto
            };

            if (int.Parse(head[AttrNames.Photo].ToString()) > 0)
            {
                MemoryStream ms = new MemoryStream(data);
                user.Photo = Image.FromStream(ms);
            }             //用户头像数据
            OnLoginDone?.Invoke(resultHead, user);
        }
Example #2
0
        //处理获取用户列表的不连续返回包。当所有包接收完毕后返回给客户
        private static void HandleGetUsersPack(JObject head, byte[] data)
        {
            ResultHead result = GetResultHead(head);

            if (head[AttrNames.Error].ToString() != string.Empty)
            {
                OnGetUserListDone?.Invoke(result, new User[0]);
                return;
            }             //获取失败
            else if (int.Parse(head[AttrNames.Count].ToString()) <= 0)
            {
                User[] us;
                if (workingDictionary.ContainsKey(result.Token))
                {
                    us = workingDictionary[result.Token] as User[];
                }
                else
                {
                    us = new User[0];
                }
                User.Users = us;
                OnGetUserListDone?.Invoke(result, us);
                return;
            }             //获取完成
            //获取用户数据
            User user = new User
            {
                Name     = head[AttrNames.User].ToString(),
                NickName = head[AttrNames.NickName].ToString(),
                Motto    = head[AttrNames.Motto].ToString(),
                Group    = (UserGroup)Enum.Parse(typeof(UserGroup), head[AttrNames.UGroup].ToString()),
                Photo    = User.DefaultPhoto
            };             //基础数据

            if (int.Parse(head[AttrNames.Photo].ToString()) > 0)
            {
                MemoryStream ms = new MemoryStream(data);
                user.Photo = Image.FromStream(ms);
            }             //头像数据
            //加入临时用户列表缓存
            User[] users;
            int    total = int.Parse(head[AttrNames.Total].ToString());          //总用户数
            int    count = int.Parse(head[AttrNames.Count].ToString());          //已接收用户数

            if (count > total)
            {
                return;
            }
            if (workingDictionary.ContainsKey(head[AttrNames.Token].ToString()))
            {
                users = workingDictionary[result.Token] as User[];
            }
            else
            {
                users = new User[total];
            }
            users[count - 1] = user;
            workingDictionary[result.Token] = users;
        }
Example #3
0
        //提取基本结果包头结构
        private static ResultHead GetResultHead(JObject head)
        {
            ResultHead resultHead = new ResultHead
            {
                Token     = head[AttrNames.Token].ToString(),
                Operation = head[AttrNames.Operation].ToString(),
            };

            if (head[AttrNames.Error] != null)
            {
                resultHead.Error = head[AttrNames.Error].ToString();
            }
            return(resultHead);
        }
Example #4
0
        //收到消息
        private static void HandleMessage(JObject head, byte[] data)
        {
            //提取结果包头
            ResultHead resultHead = GetResultHead(head);
            Message    message    = new Message()
            {
                When = DateTime.Parse(head[AttrNames.When].ToString()),
                From = User.FromUserName(head[AttrNames.From].ToString()),
                To   = User.Me,
                Text = Encoding.UTF8.GetString(data)
            };

            OnMessage?.Invoke(message);
        }
Example #5
0
 //处理服务器异常断开连接消息
 private static void HandlePanic(ResultHead head)
 {
     SetStatus(ClientStatus.Stopped);
     OnPanic?.Invoke(head);
 }
Example #6
0
 //处理更改信息结果
 private static void HandleUpdateUserInfoDone(ResultHead head)
 {
     OnUpdateUserInfoDone?.Invoke(head);
 }
Example #7
0
 //处理掉线、强制登出
 private static void HandleOffiline(ResultHead head)
 {
     SetStatus(ClientStatus.Stopped);
     OnOffline?.Invoke(head);
 }
Example #8
0
 //发送消息执行结果
 private static void HandleSendMessageResult(ResultHead head)
 {
     OnSendMessageDone?.Invoke(head);
 }
Example #9
0
        // 消息写入线程,向tcp连接写入数据
        private static void SendLoop()
        {
            Packet        packet = null;
            NetworkStream stream = tcpClient.GetStream();
            //json序列化时忽略值为null的项
            JsonSerializerSettings setting = new JsonSerializerSettings();

            setting.NullValueHandling = NullValueHandling.Ignore;
            try
            {
                //阻塞式的从发送队列中取出数据
                foreach (Packet i in sendQueue.GetConsumingEnumerable())
                {
                    packet = i;                      //为了在代码块外引用i
                    //结束循环
                    if (StormClient.Status != ClientStatus.Running)
                    {
                        break;
                    }
                    //向tcp连接写数据
                    byte[] lenBuffer;                     //数据长度缓存
                    byte[] headData = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(packet.Head, setting));
                    //写包头
                    lenBuffer = BitConverter.GetBytes((UInt32)IPAddress.HostToNetworkOrder(headData.Length));
                    stream.Write(lenBuffer, 0, 4);
                    stream.Write(headData, 0, headData.Length);
                    //写数据
                    int length = 0;
                    if (packet.Data != null)
                    {
                        length = packet.Data.Length;
                    }
                    lenBuffer = BitConverter.GetBytes((UInt32)IPAddress.HostToNetworkOrder(length));
                    stream.Write(lenBuffer, 0, 4);
                    if (length > 0)
                    {
                        stream.Write(packet.Data, 0, packet.Data.Length);
                    }
                    //发送成功回调
                    ResultHead result = new ResultHead
                    {
                        Token     = packet.Head.Token,
                        Operation = packet.Head.Operation,
                        Error     = ""
                    };
                    packet.CallBack?.Invoke(result);
                }
            }
            catch (System.IO.IOException ex)
            {
                HandleConnectionBroken(ex);
            }
            catch (ObjectDisposedException ex)
            {
                HandleConnectionBroken(ex);
            }
            finally
            {
                List <Packet> packets = new List <Packet>(sendQueue.Count + 1);
                if (packet != null)
                {
                    packets.Add(packet);
                }
                while (sendQueue.TryTake(out packet))
                {
                    if (packet != null)
                    {
                        packets.Add(packet);
                    }
                }
                foreach (Packet p in packets)
                {
                    //发送失败回调
                    ResultHead result = new ResultHead
                    {
                        Token     = packet.Head.Token,
                        Operation = packet.Head.Operation,
                        Error     = "Client has stopped running."
                    };
                    packet.CallBack?.Invoke(result);
                }
            }
        }