//处理登录反馈消息 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); }
//处理获取用户列表的不连续返回包。当所有包接收完毕后返回给客户 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; }
//提取基本结果包头结构 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); }
//收到消息 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); }
//处理服务器异常断开连接消息 private static void HandlePanic(ResultHead head) { SetStatus(ClientStatus.Stopped); OnPanic?.Invoke(head); }
//处理更改信息结果 private static void HandleUpdateUserInfoDone(ResultHead head) { OnUpdateUserInfoDone?.Invoke(head); }
//处理掉线、强制登出 private static void HandleOffiline(ResultHead head) { SetStatus(ClientStatus.Stopped); OnOffline?.Invoke(head); }
//发送消息执行结果 private static void HandleSendMessageResult(ResultHead head) { OnSendMessageDone?.Invoke(head); }
// 消息写入线程,向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); } } }