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)); }
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); }
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); } } }