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