/// <summary> /// 事件处理函数,用户向好友广播消息,登录、退出 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void HandleEvent(object sender, ChatEventArgs e) { ChatterService friendChatterService = sender as ChatterService; if (Online.ContainsKey(member.Id)) { try { switch (e.Type) { ///账户为id的好友登录 case MessageType.Login: { ///为好友订阅事件,以便自己登录退出通知他 ChatEvent += friendChatterService.myEventHandler; callback.OnLogin(e.Id); break; } ///用户名为id的好友退出 case MessageType.Logoff: { ///为好友取消订阅 ChatEvent -= friendChatterService.myEventHandler; callback.OnLogoff(e.Id); break; } } } catch (Exception ex) { MyLogger.Logger.Warn("回调失败" + member.Id); } } }
public void Logoff(Member member) { MyLogger.Logger.Info(String.Format("用户{0}退出", member.Id + " " + member.NickName)); ChatEventArgs e = new ChatEventArgs(); e.Id = member.Id; e.NickName = member.NickName; e.Type = MessageType.Logoff; if (Online.ContainsKey(member.Id)) Online.Remove(member.Id); if (lastUpdateTable.ContainsKey(member.Id)) lastUpdateTable.Remove(member.Id); BroadCatMessage(e); PrintOnLineNumber(); }
/// <summary> /// 向好友广播消息,比如登录、退出 /// </summary> /// <param name="e"></param> private void BroadCatMessage(ChatEventArgs e) { ///当在线好友数为0时 if (ChatEvent == null) return; ///对好友广播消息 foreach (ChatEventHandler hanlder in ChatEvent.GetInvocationList()) { hanlder.BeginInvoke(this, e, new AsyncCallback(EndAsync), hanlder); } }
/// <summary> /// 处理用户登录 /// </summary> /// <param name="member">包含用户名密码的member</param> /// <returns>返回登录结果,如果登录成功,Result.Member 包含用户的信息</returns> public Result Login(Member member) { MyLogger.Logger.Info(String.Format("用户{0}请求登录", member.Id + " " + member.NickName)); try { ///判断用户名和密码是否正确 if (!DALService.IsMember(member.Id, member.Password)) { MyLogger.Logger.Info(String.Format("用户{0}登录失败", member.Id + " " + member.NickName)); return new Result() { Status = MessageStatus.Failed }; } member.Password = null; this.member = DALService.GetMember(member.Id); lastUpdateTable.Add(this.member.Id, DateTime.Now); GetEndPoint(); ///获得回调句柄 callback = OperationContext.Current.GetCallbackChannel<IChatterCallback>(); ///获得好友们的id RefreshFriendsList(); ///新建消息处理函数,处理登录、退出消息 myEventHandler = new ChatEventHandler(HandleEvent); ///新建消息参数 ChatEventArgs e = new ChatEventArgs(); ///消息发出者的id e.Id = member.Id; ///消息发出者的昵称 e.NickName = member.NickName; ///消息类型为登录 e.Type = MessageType.Login; ///为每个在线好友订阅事件 foreach (string friendId in friends.Keys) { if (Online.ContainsKey(friendId)) { ChatEvent += Online[friendId] as ChatEventHandler; } } var groups = DALService.GetAllGroups(member.Id); foreach (var group in groups) { foreach (Member m in group.GroupMember) { if (Online.ContainsKey(m.Id)&&!(friends.ContainsKey(m.Id))) { ChatEvent += Online[m.Id] as ChatEventHandler; } } } ///广播消息 将登录退出的消息发给好友 BroadCatMessage(e); ///加锁,防止多线程同时访问 lock (lockObj) { ///将用户加到在线列表 Online.Add(member.Id, myEventHandler); } MyLogger.Logger.Info(String.Format("用户{0}登录成功", member.Id + " " + member.NickName)); ///打印在线人数 PrintOnLineNumber(); } catch (Exception e) { MyLogger.Logger.Error(member.Id + "登录时候出现错误", e); return new Result() { Status = MessageStatus.Failed, Member = null }; } ///返回登录结果 return new Result() { Status = MessageStatus.OK, Member = DALService.GetMember(member.Id) }; }