Beispiel #1
0
        /// <summary>
        /// 用户断开处理回调
        /// </summary>
        /// <param name="msg"></param>
        /// <param name="socketAsync"></param>
        /// <param name="error"></param>
        private void Service_UserDisconnect(string msg, SocketAsyncEventArgs socketAsync, int error)
        {
            ZYNetSession session = socketAsync.UserToken as ZYNetSession;

            if (session != null)
            {
                if (UserDisconnect != null)
                {
                    UserDisconnect(session);
                }

                SessionDiy.TryRemove(session.Id, out session);

                RemoveSession tmp = new RemoveSession()
                {
                    Id = session.Id
                };

                SendAll(BufferFormat.FormatFCA(tmp));
            }

            socketAsync.UserToken = null;
            socketAsync.AcceptSocket.Close();
            socketAsync.AcceptSocket.Dispose();


            LLOG("Servv:" + msg, EventLogType.INFO);
        }
        protected void HandleEventRemoveSession(IEventData eventData, SendParameters sendParameters)
        {
            var serverEvent = new RemoveSession(Protocol, eventData);

            if (!serverEvent.IsValid)
            {
                Logger.ErrorFormat("[HandleEventRemoveSession]: Event (Code={0}) is invalid (Error={1})", eventData.Code, serverEvent.GetErrorMessage());
            }
            else
            {
                // using a seperate thread to avoid message throttling
                this.messageFiber.Enqueue(() => this.HandleRemoveSession(serverEvent));
            }
        }
        /// <summary>
        /// Removes a(n) <see cref="ISession"/>.
        /// </summary>
        /// <param name="removeSession"> </param>
        private void HandleRemoveSession(RemoveSession removeSession)
        {
            ISession session;

            if (sessions.TryGetValue(removeSession.SessionId, out session))
            {
                sessions.Remove(removeSession.SessionId);
                // destroy the session due to disconnect
                session.Destroy(DestroySessionReason.Disconnect);
            }
            else
            {
                Logger.ErrorFormat("[HandleRemoveSession]: Session (Id={0}) cannot be found", removeSession.SessionId);
            }
        }
        /// <summary>
        /// Notifies a list of peers of the client disconnect based on the <see cref="oldState"/>.
        /// </summary>
        protected void NotifyDisconnection(ClientPeerState oldState, IEnumerable <IncomingSubServerPeer> excludeList)
        {
            var servers        = this.Application.MasterLobby.SubServers;
            var receivingPeers = new List <IncomingSubServerPeer>();

            if (oldState == ClientPeerState.Login || oldState == ClientPeerState.Connect)
            {
                var loginServer = servers.LoginServer;
                if (loginServer != null)
                {
                    receivingPeers.Add(loginServer);
                }
            }

            if (oldState == ClientPeerState.WorldEnter || oldState == ClientPeerState.WorldTransfer)
            {
                var chatServer = servers.ChatServer;
                if (chatServer != null)
                {
                    receivingPeers.Add(chatServer);
                }

                var socialServer = servers.SocialServer;
                if (socialServer != null)
                {
                    receivingPeers.Add(socialServer);
                }

                var worldServer = WorldServer;
                if (worldServer != null)
                {
                    receivingPeers.Add(worldServer);
                }
            }

            if (excludeList != null)
            {
                foreach (var peer in excludeList)
                {
                    receivingPeers.Remove(peer);
                }
            }
#if MMO_DEBUG
            if (_logger.IsDebugEnabled)
            {
                _logger.DebugFormat("Removing client (Id={0}) from: {1}", this.ClientId, string.Join(", ", receivingPeers));
            }
#endif
            if (receivingPeers.Count > 0)
            {
                var removePlayer = new RemoveSession
                {
                    SessionId = this.ClientId
                };

                var eventData = new EventData((byte)ServerEventCode.RemoveSession, removePlayer);
                eventData.SendTo(receivingPeers, new SendParameters());
            }

            if (this.loginData != null)
            {
                MasterClientPeer exisitingPeer;
                if (this.application.MasterLobby.Users.TryGetValue(this.loginData.Username, out exisitingPeer))
                {
                    // only remove the username if this client still owns the user
                    if (exisitingPeer == this)
                    {
                        this.application.MasterLobby.Users.Remove(this.loginData.Username);
                    }
                }
            }

            this.WorldServer = null;
        }
 public StatefulStoragePerSession()
     : base((key) => HttpContext.Current.Session[key],
            (key, value) => HttpContext.Current.Session[key] = value,
            (key) => RemoveSession()(key, HttpContext.Current.Session.Keys, HttpContext.Current.Session.Remove))
 {
 }
 public StatefulStoragePerSession(HttpSessionStateBase session)
     : base((key) => session[key],
            (key, value) => session[key] = value,
            (key) => RemoveSession()(key, session.Keys, session.Remove))
 {
 }