Example #1
0
        /// <summary>
        /// 断开连接
        /// </summary>
        public override void DisConnect()
        {
            try
            {
                Connected = false;
                if (NetSocket == null)
                {
                    return;
                }
                OnDisConnect?.Invoke(this);
            }
            catch { }

            try
            {
                SendParser.Clear();
                RecvParser.Clear();
                NetSocket.Close();
                NetSocket.Dispose();
                NetSocket = null;

                this.inArgs.Dispose();
                this.outArgs.Dispose();
            }
            catch { }
        }
Example #2
0
 public override void Close()
 {
     DisConnect();
     rpcActions.Clear();
     SendParser.Clear();
     RecvParser.Clear();
     OnClose?.Invoke();
     OnClose   = null;
     OnError   = null;
     OnReceive = null;
     base.Close();
 }
Example #3
0
        public override async Task StartRecv()
        {
            while (true)
            {
                if (!netStream.CanRead)
                {
                    return;
                }

                try
                {
                    var count = await netStream.ReadAsync(RecvParser.Buffer.Last, RecvParser.Buffer.LastOffset, RecvParser.Buffer.LastCount);

                    if (count <= 0)
                    {
                        throw new SocketException((int)SocketError.SocketError);
                    }
                    RecvParser.Buffer.UpdateWrite(count);
                    recvTime = DateTime.Now;
                    while (true)
                    {
                        var packet = RecvParser.ReadBuffer();
                        if (!packet.IsSuccess)
                        {
                            break;
                        }
                        if (!packet.IsHeartbeat)
                        {
                            if (packet.IsRpc)
                            {
                                if (rpcActions.TryRemove(packet.RpcId, out Action <Packet> action))
                                {
                                    action(packet);
                                }
                            }
                            else
                            {
                                OnReceive?.Invoke(packet);
                            }
                        }
                    }
                }
                catch
                {
                    OnError?.Invoke(this, SocketError.SocketError);
                }
            }
        }
Example #4
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 #5
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();
        }