Example #1
0
        /// <summary>
        /// 模拟TCP三次握手连接服务端
        /// </summary>
        /// <returns></returns>
        public override void StartConnecting()
        {
            try
            {
                var now = TimeUitls.Now();
                if (now - this.LastConnectTime < ANetChannel.ReConnectInterval)
                {
                    return;
                }

                this.LastConnectTime = now;

                if (Connected)
                {
                    return;
                }

                ConnectSender.SendSYN(this.NetSocket, this.RemoteEndPoint);
            }
            catch (Exception e)
            {
#if DEBUG
                LogRecord.Log(LogLevel.Warn, "StartConnecting", e);
#endif
            }
        }
Example #2
0
        /// <summary>
        /// 处理数据发送回调函数
        /// </summary>
        protected void HandleSend()
        {
            try
            {
                while (!this.sendQueue.IsEmpty)
                {
                    if (this.sendQueue.TryPeek(out SendTask send))
                    {
                        if (send.Channel.Connected)
                        {
                            this.sendQueue.TryDequeue(out SendTask sendTask);
                            sendTask.Channel.TimeNow = TimeUitls.Now();
                            sendTask.WriteToBuffer();
                            this.senders.Add(sendTask.Channel);
                        }
                    }
                }

                foreach (var channel in this.senders)
                {
                    channel.StartSend();
                }
                this.senders.Clear();

                this.CheckHeadbeat();
            }
            catch (Exception e)
            {
#if DEBUG
                LogRecord.Log(LogLevel.Warn, "HandleSend", e);
#endif
            }
        }
Example #3
0
        /// <summary>
        /// 心跳检测
        /// </summary>
        private void CheckHeadbeat()
        {
            var now = TimeUitls.Now();

            var lastCheckSpan = now - this.LastCheckTime;

            if (lastCheckSpan < HeartbeatTime)
            {
                return;
            }

            if (this.serviceType == NetServiceType.Client)
            {
                if (this.ClientChannel == null)
                {
                    return;
                }
                if (!this.ClientChannel.Connected)
                {
                    return;
                }
                var timeSpan = now - this.ClientChannel.LastSendTime;
                if (timeSpan > HeartbeatTime)
                {
                    this.Session.SendMessage(new Packet
                    {
                        IsHeartbeat = true
                    });
#if DEBUG
                    LogRecord.Log(LogLevel.Info, "CheckHeadbeat", $"发送心跳包到服务端:{this.ClientChannel.RemoteEndPoint}.");
#endif
                }
            }
            else if (this.serviceType == NetServiceType.Server)
            {
                var channels = this.Channels.Values;
                foreach (var channel in channels)
                {
                    var timeSpan = now - channel.LastRecvTime;
                    if (timeSpan > HeartbeatTime)
                    {
#if DEBUG
                        LogRecord.Log(LogLevel.Info, "CheckHeadbeat", $"客户端:{channel.RemoteEndPoint}连接超时,心跳检测断开,心跳时长{timeSpan}.");
#endif
                        channel.DisConnect();
                    }
                }
            }
            LastCheckTime = now;
        }
Example #4
0
        /// <summary>
        /// KCP发送回调函数
        /// </summary>
        /// <param name="bytes"></param>
        /// <param name="count"></param>
        /// <param name="user"></param>
        private void Output(byte[] bytes, int count, object user)
        {
            try
            {
                this.NetSocket.SendTo(bytes, 0, count, SocketFlags.None, this.RemoteEndPoint);
                this.LastSendTime = TimeUitls.Now();
            }
            catch (Exception e)
            {
                DisConnect();
#if DEBUG
                LogRecord.Log(LogLevel.Warn, "Output", e);
#endif
            }
        }
Example #5
0
        /// <summary>
        /// 开始连接
        /// </summary>
        /// <returns></returns>
        public override void StartConnecting()
        {
            try
            {
                var now = TimeUitls.Now();
                if (now - this.LastConnectTime < ANetChannel.ReConnectInterval)
                {
                    return;
                }

                this.LastConnectTime = now;

                if (Connected)
                {
                    return;
                }

                if (this.NetSocket == null)
                {
                    this.NetSocket         = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                    this.NetSocket.NoDelay = true;

                    this.inArgs             = new SocketAsyncEventArgs();
                    this.outArgs            = new SocketAsyncEventArgs();
                    this.inArgs.Completed  += OnComplete;
                    this.outArgs.Completed += OnComplete;
                }

                this.outArgs.RemoteEndPoint = this.RemoteEndPoint;
                if (this.NetSocket.ConnectAsync(this.outArgs))
                {
                    return;
                }
                OnConnectComplete(this.outArgs);
            }
            catch (Exception e)
            {
#if DEBUG
                LogRecord.Log(LogLevel.Warn, "StartConnecting", e);
#endif
            }
        }
Example #6
0
        private void OnConnectComplete(object o)
        {
            if (this.NetSocket == null)
            {
                return;
            }

            SocketAsyncEventArgs e = (SocketAsyncEventArgs)o;

            if (e.SocketError != SocketError.Success)
            {
                this.OnError?.Invoke(this, SocketError.SocketError);
                return;
            }

            this.LastConnectTime = TimeUitls.Now();
            e.RemoteEndPoint     = null;
            OnConnect?.Invoke(this);
            this.Connected = true;

            //this.StartRecv();
            //this.StartSend();
        }
Example #7
0
        /// <summary>
        /// 该方法并没有用
        /// </summary>
        public override void StartRecv()
        {
            this.LastRecvTime = TimeUitls.Now();
            SetKcpSendTime();
            while (true)
            {
                int n = kcp.PeekSize();
                if (n == 0)
                {
                    //LogRecord.Log(LogLevel.Error, "StartRecv", $"解包失败:{this.RemoteEndPoint}");
                    return;
                }

                int count = this.kcp.Recv(cacheBytes, 0, cacheBytes.Length);
                if (count <= 0)
                {
                    return;
                }

                RecvParser.WriteBuffer(cacheBytes, 0, count);
                while (true)
                {
                    try
                    {
                        var packet = RecvParser.ReadBuffer();
                        if (!packet.IsSuccess)
                        {
                            break;
                        }

                        if (!packet.IsHeartbeat)
                        {
                            //LogRecord.Log(LogLevel.Error, "StartRecv", $"收到远程电脑:{this.RemoteEndPoint}");
                            if (packet.IsRpc)
                            {
                                if (RpcDictionarys.TryRemove(packet.RpcId, out Action <Packet> action))
                                {
                                    //执行RPC请求回调
                                    action(packet);
                                }
                                else
                                {
                                    OnReceive?.Invoke(packet);
                                }
                            }
                            else
                            {
                                OnReceive?.Invoke(packet);
                            }
                        }
                        else
                        {
#if DEBUG
                            LogRecord.Log(LogLevel.Warn, "HandleRecv", $"接收到客户端:{this.RemoteEndPoint}心跳包.");
#endif
                        }
                    }
                    catch (Exception e)
                    {
                        DisConnect();
#if DEBUG
                        LogRecord.Log(LogLevel.Warn, "StartRecv", e);
#endif
                        return;
                    }
                }
            }
        }
Example #8
0
        private void OnRecvComplete(object o)
        {
            isReceiving = false;
            if (this.NetSocket == null)
            {
                return;
            }

            this.LastRecvTime = TimeUitls.Now();
            SocketAsyncEventArgs e = (SocketAsyncEventArgs)o;

            if (e.SocketError != SocketError.Success)
            {
                DisConnect();
                return;
            }

            if (e.BytesTransferred == 0)
            {
                DisConnect();
                return;
            }

            RecvParser.Buffer.UpdateWrite(e.BytesTransferred);

            while (true)
            {
                try
                {
                    var packet = RecvParser.ReadBuffer();

                    if (!packet.IsSuccess)
                    {
                        break;
                    }
                    LastRecvTime = TimeUitls.Now();
                    if (!packet.IsHeartbeat)
                    {
                        if (packet.IsRpc)
                        {
                            if (RpcDictionarys.TryRemove(packet.RpcId, out Action <Packet> action))
                            {
                                //执行RPC请求回调
                                action(packet);
                            }
                            else
                            {
                                OnReceive?.Invoke(packet);
                            }
                        }
                        else
                        {
                            OnReceive?.Invoke(packet);
                        }
                    }
                }
                catch (Exception ex)
                {
                    DisConnect();
#if DEBUG
                    LogRecord.Log(LogLevel.Warn, "OnRecvComplete", ex);
#endif
                    return;
                }
            }
            this.StartRecv();
        }