/// <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)) { }