Ejemplo n.º 1
0
 public void ApplyState(NetSessionState sessionState)
 {
     FocussedEntity = World.EntityById(sessionState.FocussedEntityId);
     ActivePlayer   = PlayerById(sessionState.ActivePlayerId);
     Winner         = PlayerById(sessionState.WinnerId);
     TurnState      = (TurnState)sessionState.TurnState;
     State          = (SessionState)sessionState.SessionState;
 }
Ejemplo n.º 2
0
        // 连接远程地址
        public INetSession Connect(string remoteAddr, Int32 remotePort, bool isSync, ref bool isSuccess)
        {
            isSuccess = false;
            if (remoteAddr == null || remotePort <= 0)
            {
                Trace.Assert(false, "Connect param error");
                return(null);
            }

            NetSessionImpl netSession = NetSessionPool.GetInstance().MallocNetSession();

            if (netSession == null)
            {
                Trace.Assert(false, "malloc session null");
                return(null);
            }

            // 同步连接
            if (isSync)
            {
                if (!netSession.PostConnect(remoteAddr, remotePort, true))
                {
                    NetSessionPool.GetInstance().FreeNetSession(netSession);
                    return(null);
                }

                // 设置会话的状态
                NetSessionState sessionState = new NetSessionState();
                sessionState.Reset((Int32)NETSESSIONSTATE.netSessionStateUsing);
                netSession.SetSessionState(ref sessionState);

                // 投递接收操作
                if (!netSession.PostRcv())
                {
                    // 关闭会话,返回会话池
                    NetSessionPool.GetInstance().FreeNetSession(netSession);
                    return(null);
                }

                // 添加到活动会话队列
                netSessionDic.Add(netSession.GetSessionID(), netSession);

                isSuccess = true;
                return((INetSession)netSession);
            }
            // 异步连接
            else
            {
                if (netSession.PostConnect(remoteAddr, remotePort, false))
                {
                    isSuccess = true;
                }
            }

            return(null);
        }
Ejemplo n.º 3
0
        // 关闭会话(会引发删除事件)
        private void CloseNetSession(NetSessionImpl netSession, EVENTSESSIONPLACE eventPlace)
        {
            if (netSession == null)
            {
                return;
            }

            // 修改状态
            NetSessionState sessionState = new NetSessionState();

            sessionState.Reset((Int32)NETSESSIONSTATE.netSessionStateMax);
            if (eventPlace == EVENTSESSIONPLACE.sendDelSession)
            {
                sessionState.sendUseState = (Int32)NETSESSIONSTATE.netSessionStateShutdown;
            }
            else if (eventPlace == EVENTSESSIONPLACE.rcvDelSession)
            {
                sessionState.rcvUseState = (Int32)NETSESSIONSTATE.netSessionStateShutdown;
            }
            else if (eventPlace == EVENTSESSIONPLACE.appDelSession)
            {
                sessionState.appUseState = (Int32)NETSESSIONSTATE.netSessionStateShutdown;
            }
            else
            {
                Trace.Assert(false, "Error eventPlace");
            }

            // 通知 moduleMgr
            NetSessionState retState = netSession.SetSessionState(ref sessionState);

            if (eventPlace == EVENTSESSIONPLACE.sendDelSession)
            {
                if (retState.appUseState == (Int32)NETSESSIONSTATE.netSessionStateUsing)
                {
                    AddNetEvent(netSession, ADDORDELSESSIONEVENT.delNetSession, eventPlace);
                }
            }
            else if (eventPlace == EVENTSESSIONPLACE.rcvDelSession)
            {
                if (retState.appUseState == (Int32)NETSESSIONSTATE.netSessionStateUsing)
                {
                    AddNetEvent(netSession, ADDORDELSESSIONEVENT.delNetSession, eventPlace);
                }
            }
            else
            {
                Trace.Assert(false, "Error eventPlace");
            }

            // 关闭 Socket
            netSession.CloseSocket();
        }
Ejemplo n.º 4
0
        // 设置会话的状态
        public NetSessionState SetSessionState(ref NetSessionState sessionState)
        {
            lock (usingStateLock)
            {
                if (sessionState.appUseState != (Int32)NETSESSIONSTATE.netSessionStateMax)
                {
                    usingState.appUseState = sessionState.appUseState;
                    if (usingState.appUseState == (Int32)NETSESSIONSTATE.netSessionStateShutdown)
                    {
                        if (!IsSending() && usingState.sendUseState != (Int32)NETSESSIONSTATE.netSessionStateShutdown)
                        {
                            usingState.sendUseState = (Int32)NETSESSIONSTATE.netSessionStateShutdown;
                        }

                        if (!IsRcving() && usingState.rcvUseState != (Int32)NETSESSIONSTATE.netSessionStateShutdown)
                        {
                            usingState.rcvUseState = (Int32)NETSESSIONSTATE.netSessionStateShutdown;
                        }
                    }
                }

                if (sessionState.sendUseState != (Int32)NETSESSIONSTATE.netSessionStateMax)
                {
                    usingState.sendUseState = sessionState.sendUseState;
                    if (usingState.sendUseState == (Int32)NETSESSIONSTATE.netSessionStateShutdown)
                    {
                        if (!IsRcving() && usingState.rcvUseState != (Int32)NETSESSIONSTATE.netSessionStateShutdown)
                        {
                            usingState.rcvUseState = (Int32)NETSESSIONSTATE.netSessionStateShutdown;
                        }
                    }
                }

                if (sessionState.rcvUseState != (Int32)NETSESSIONSTATE.netSessionStateMax)
                {
                    usingState.rcvUseState = sessionState.rcvUseState;
                    if (usingState.rcvUseState == (Int32)NETSESSIONSTATE.netSessionStateShutdown)
                    {
                        if (!IsSending() && usingState.sendUseState != (Int32)NETSESSIONSTATE.netSessionStateShutdown)
                        {
                            usingState.sendUseState = (Int32)NETSESSIONSTATE.netSessionStateShutdown;
                        }
                    }
                }

                return(usingState);
            }
        }
Ejemplo n.º 5
0
 // 构造、析构函数
 #region
 public NetSessionImpl()
 {
     setSecurityPolicy  = false;
     postRcving         = false;
     remotePort         = 0;
     netSocket          = null;
     sessionIndex       = 0;
     sendByteCounts     = 0;
     rcvByteCounts      = 0;
     rcvDataBuffer      = null;
     usingStateLock     = null;
     sendDataBufferMgr  = null;
     rcvAsyncEventArgs  = null;
     sendAsyncEventArgs = null;
     usingState         = new NetSessionState();
     usingState.Reset((Int32)NETSESSIONSTATE.netSessionStateNull);
 }
Ejemplo n.º 6
0
        // 处理添加、删除网络会话事件
        #region
        public void HandleAddOrDelEvent(AddOrDelSessionEvent addOrDelEvent)
        {
            NetSessionImpl netSession = addOrDelEvent.netSession;

            if (netSession == null)
            {
                return;
            }

            switch (addOrDelEvent.eventType)
            {
            case ADDORDELSESSIONEVENT.addNetSession:
            {
                // 设置会话的状态
                NetSessionState sessionState = new NetSessionState();
                sessionState.Reset((Int32)NETSESSIONSTATE.netSessionStateUsing);
                netSession.SetSessionState(ref sessionState);

                if (!netSession.PostRcv())
                {
                    // 关闭会话,返回会话池
                    NetSessionPool.GetInstance().FreeNetSession(netSession);
                }
                else
                {
                    netSessionDic.Add(netSession.GetSessionID(), netSession);

                    // 通知上层
                    if (netSessionConnectedCallbackFunc != null)
                    {
                        netSessionConnectedCallbackFunc((INetSession)netSession, addOrDelEvent.eventPlace, true);
                    }
                }
            }
            break;

            case ADDORDELSESSIONEVENT.delNetSession:
            {
                // 通知应用层
                if (addOrDelEvent.eventPlace != EVENTSESSIONPLACE.appDelSession)
                {
                    if (netSessionClosedCallbackFunc != null)
                    {
                        netSessionClosedCallbackFunc(addOrDelEvent.netSession, addOrDelEvent.eventPlace);
                    }

                    NetSessionState sessionState = new NetSessionState();
                    sessionState.Reset((Int32)NETSESSIONSTATE.netSessionStateMax);
                    sessionState.appUseState = (Int32)NETSESSIONSTATE.netSessionStateShutdown;
                    addOrDelEvent.netSession.SetSessionState(ref sessionState);
                }
            }
            break;

            case ADDORDELSESSIONEVENT.asyncConnectFailed:
            {
                // 通知上层
                if (netSessionConnectedCallbackFunc != null)
                {
                    netSessionConnectedCallbackFunc((INetSession)netSession, addOrDelEvent.eventPlace, false);
                }

                // 关闭会话,返回会话池
                NetSessionPool.GetInstance().FreeNetSession(netSession);
            }
            break;

            default:
                break;
            }
        }