Пример #1
0
        /// <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);


                }

            }
        }
Пример #2
0
        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();

        }
Пример #3
0
        /// <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);
            }

        }
Пример #4
0
        /// <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) };
        }