예제 #1
0
        /// <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);
        }
예제 #2
0
        /// <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);
                }
            }
        }
예제 #3
0
        /// <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);
            }
        }