/// <summary> /// 网络频道 /// </summary> /// <param name="socket">网络套接字</param> /// <param name="packer">拆包打包器</param> /// <param name="name">频道名字</param> public NetworkChannel(ISocket socket, IPacker packer, string name) { Guard.Requires <ArgumentNullException>(socket != null); Guard.Requires <ArgumentNullException>(packer != null); Guard.NotEmptyOrNull(name, "name"); Name = name; this.socket = socket; this.packer = packer; receiveState = new ReceiveState(packer); heartBeatState = new HeartBeatState(0); lastException = null; heartBeatState.OnMissHeartBeat += (count) => { if (OnMissHeartBeat != null) { OnMissHeartBeat.Invoke(this, count); } }; socket.On(SocketEvents.Connect, OnSocketConnect); socket.On(SocketEvents.Error, OnSocketError); socket.On(SocketEvents.Closed, OnSocketClosed); socket.On(SocketEvents.Message, OnSocketMessage); socket.On(SocketEvents.Disconnect, OnSocketDisconnect); socket.On(SocketEvents.Sent, OnSocketSent); }
/// <summary> /// 当网络频道丢失心跳包时 /// </summary> /// <param name="channel">网络频道</param> /// <param name="missCount">心跳丢失次数</param> private void OnChannelMissHeartBeat(INetworkChannel channel, int missCount) { if (OnMissHeartBeat == null) { return; } lock (OnMissHeartBeat) { if (OnMissHeartBeat != null) { OnMissHeartBeat.Invoke(channel, missCount); } } }
/// <summary> /// 触发心跳流逝 /// </summary> /// <param name="elapseMillisecond">流逝时间</param> public void Tick(int elapseMillisecond) { if (interval <= 0) { return; } this.elapseMillisecond += Math.Max(elapseMillisecond, 0); if (!(this.elapseMillisecond >= interval)) { return; } missCount++; this.elapseMillisecond = 0; if (OnMissHeartBeat != null) { OnMissHeartBeat.Invoke(missCount); } }