Beispiel #1
0
 public void OnDisconnectEvent(int hostId, int connectionId, int channelId)
 {
     // Stop() 이 먼저 호출됐다면 이미 Id 필드는 초기화되므로 파라미터를 이용하는게 안전
     _serverPeer.OnRemoved();
     // 호출할 필요 없음
     // NetworkTransport.RemoveHost(hostId);
     _serverPeer = null;
     _isDead     = true;
     Debug.Log(string.Format("Disconnect from server. Id : {0}", connectionId));
 }
Beispiel #2
0
        public bool OnSystemPacket(Packet msg)
        {
            switch (msg.ProtocolId)
            {
            case NetworkDefine.SYS_CLOSE_REQ:
                DisConnect();
                return(true);

            case NetworkDefine.SYS_START_HEARTBEAT:
            {
                msg.PopProtocolId();
                byte interval = msg.PopByte();
                this.HeartbeatSender = new HeartbeatSender(this, interval);

                if (this.AutoHeartbeat)
                {
                    StartHeartbeat();
                }
            }
                return(true);

            case NetworkDefine.SYS_UPDATE_HEARTBEAT:
                this.LatestHeartbeatTime = DateTime.Now.Ticks;
                return(true);
            }


            if (Peer != null)
            {
                try
                {
                    if (msg.ProtocolId == NetworkDefine.SYS_CLOSE_ACK)
                    {
                        Peer.OnRemoved();

                        if (OnSessionClosed != null)
                        {
                            OnSessionClosed(this);
                        }

                        return(true);
                    }
                }
                catch (Exception)
                {
                    Close();
                }
            }

            return(false);
        }
Beispiel #3
0
        public void OnMessage(Packet msg)
        {
            // active close를 위한 코딩.
            //   서버에서 종료하라고 연락이 왔는지 체크한다.
            //   만약 종료신호가 맞다면 disconnect를 호출하여 받은쪽에서 먼저 종료 요청을 보낸다.
            switch (msg.ProtocolID)
            {
            case SYS_CLOSE_REQ:
                Disconnect();
                return;

            case SYS_START_HEARTBEAT:
            {
                // 순서대로 파싱해야 하므로 프로토콜 아이디는 버린다.
                msg.PopProtocolID();
                // 전송 인터벌.
                byte interval = msg.PopByte();
                _heartbeatSender = new HeartbeatSender(this, interval);

                if (_autoHeartbeat)
                {
                    StartHeartbeat();
                }
            }
                return;

            case SYS_UPDATE_HEARTBEAT:
                LatestHeartbeatTime = DateTime.Now.Ticks;
                return;
            }


            if (_peer != null)
            {
                try
                {
                    switch (msg.ProtocolID)
                    {
                    case SYS_CLOSE_ACK:
                        _peer.OnRemoved();
                        break;

                    default:
                        _peer.OnMessage(msg);
                        break;
                    }
                }
                catch (Exception)
                {
                    Close();
                }
            }

            if (msg.ProtocolID == SYS_CLOSE_ACK)
            {
                if (onSessionClosed != null)
                {
                    onSessionClosed(this);
                }
            }
        }