public static void ListenTcp <T>(P2PTcpClient tcpClient) where T : ReceivePacket
        {
            RelationTcp_Server relationSt = new RelationTcp_Server();

            relationSt.buffer     = new byte[P2PGlobal.P2PSocketBufferSize];
            relationSt.readTcp    = tcpClient;
            relationSt.msgReceive = Activator.CreateInstance(typeof(T)) as ReceivePacket;
            relationSt.guid       = EasyInject.Get <AppCenter>().CurrentGuid;
            relationSt.readTcp.GetStream().BeginRead(relationSt.buffer, 0, relationSt.buffer.Length, ReadTcp_Server, relationSt);
        }
Exemple #2
0
        public static void ListenTcp <T>(P2PTcpClient tcpClient) where T : ReceivePacket
        {
            RelationTcp_Server relationSt = new RelationTcp_Server();

            relationSt.buffer     = new byte[P2PGlobal.P2PSocketBufferSize];
            relationSt.readTcp    = tcpClient;
            relationSt.msgReceive = Activator.CreateInstance(typeof(T)) as ReceivePacket;
            relationSt.guid       = EasyInject.Get <AppCenter>().CurrentGuid;
            relationSt.readTcp.GetStream().BeginRead(relationSt.buffer, 0, relationSt.buffer.Length, ReadTcp_Server, relationSt);
            //如果20秒仍未授权,则关闭
            TimerUtils.Instance.AddJob(() =>
            {
                if (!tcpClient.IsAuth)
                {
                    EasyOp.Do(() => tcpClient?.SafeClose());
                }
            }, 20000);
        }
        private static void ReadTcp_Server(IAsyncResult ar)
        {
            RelationTcp_Server relation = (RelationTcp_Server)ar.AsyncState;

            if (relation.guid == EasyInject.Get <AppCenter>().CurrentGuid)
            {
                if (relation.readTcp.Connected && relation.readTcp.GetStream().CanRead)
                {
                    int length = 0;
                    EasyOp.Do(() =>
                    {
                        length = relation.readTcp.GetStream().EndRead(ar);
                    }, () =>
                    {
                        if (length > 0)
                        {
                            byte[] refData = relation.buffer.Take(length).ToArray();
                            while (relation.msgReceive.ParseData(ref refData))
                            {
                                // 执行command
                                using (P2PCommand command = FindCommand(relation.readTcp, relation.msgReceive))
                                {
                                    //LogUtils.Trace($"命令类型:{relation.msgReceive.CommandType}");
                                    if (command != null)
                                    {
                                        bool isSuccess = false;
                                        EasyOp.Do(() =>
                                        {
                                            isSuccess = command.Excute();
                                        },
                                                  e =>
                                        {
                                            LogUtils.Error($"执行命令{relation.msgReceive.CommandType}时发生异常:{e}");
                                        });
                                        if (!isSuccess)
                                        {
                                            EasyOp.Do(() => { relation.readTcp?.SafeClose(); });
                                            EasyOp.Do(() => { relation.readTcp.ToClient?.SafeClose(); });
                                            return;
                                        }
                                    }
                                    else
                                    {
                                        EasyOp.Do(() => { relation.readTcp?.SafeClose(); });
                                        EasyOp.Do(() => { relation.readTcp.ToClient?.SafeClose(); });
                                        return;
                                    }
                                }
                                //重置msgReceive
                                relation.msgReceive.Reset();
                                if (refData.Length <= 0)
                                {
                                    break;
                                }
                            }
                            if (relation.readTcp.Connected)
                            {
                                EasyOp.Do(() =>
                                {
                                    relation.readTcp.GetStream().BeginRead(relation.buffer, 0, relation.buffer.Length, ReadTcp_Server, relation);
                                }, ex =>
                                {
                                    LogUtils.Debug($"Tcp连接已被断开 {relation.readTcp.RemoteEndPoint}");
                                    EasyOp.Do(() => { relation.readTcp.ToClient?.SafeClose(); });
                                });
                            }
                        }
                        else
                        {
                            EasyOp.Do(() => { relation.readTcp?.SafeClose(); });
                            EasyOp.Do(() => { relation.readTcp.ToClient?.SafeClose(); });
                        }
                    }, ex =>
                    {
                        LogUtils.Debug($"Tcp连接已被断开 {relation.readTcp.RemoteEndPoint}");
                        EasyOp.Do(() => { relation.readTcp.ToClient?.SafeClose(); });
                    });
                }
            }
            else
            {
                LogUtils.Debug($"主动断开{relation.readTcp.RemoteEndPoint}连接");
                EasyOp.Do(() => { relation.readTcp?.SafeClose(); });
                EasyOp.Do(() => { relation.readTcp.ToClient?.SafeClose(); });
            }
            //if (TcpCenter.Instance.ConnectedTcpList.Contains(relation.readTcp))
            //    TcpCenter.Instance.ConnectedTcpList.Remove(relation.readTcp);
        }