Exemple #1
0
        private async Task <bool> ProcessAppRequestProtocol(TcpClient client, bool IsReconnect = false)
        {
            Server.Logger.Debug("Now processing request protocol....");
            NetworkStream nstream           = client.GetStream();
            int           clientIdFromToken = 0;

            //1.读取配置请求1
            //TODO !!!!获取Token,截取clientID,校验
            //TODO !!!!这里的校验逻辑和httpserver_api存在太多重复,需要重构
            clientIdFromToken = await GetClientIdFromNextTokenBytes(client);

            //var userClaims = StringUtil.ConvertStringToTokenClaims(clientIdFromToken);
            if (clientIdFromToken == 0)
            {
                //TODO 2 服务端错误,校验失败
                await nstream.WriteAsync(new byte[] { (byte)ServerStatus.AuthFailed });

                client.Close();
                return(false);
            }
            else if (clientIdFromToken == -1)
            {
                //用户被禁用
                await nstream.WriteAsync(new byte[] { (byte)ServerStatus.UserBanned });

                client.Close();
                return(false);
            }

            ServerContext.CloseAllSourceByClient(clientIdFromToken);

            //1.3 获取客户端请求数
            int configRequestLength = 3;

            byte[] appRequestBytes = new byte[configRequestLength];
            int    resultByte      = await nstream.ReadAsyncEx(appRequestBytes);

            if (resultByte < 1)
            {
                CloseClient(client);
                return(true);
            }

            Server.Logger.Debug("appRequestBytes received.");
            ServerContext.ClientConnectCount += 1;

            //2.根据配置请求1获取更多配置信息
            int appCount = (int)appRequestBytes[2];

            byte[] consumerPortBytes = new byte[appCount * (2 + 1 + 1024 + 96)];//TODO 2 暂时这么写,亟需修改
            int    resultByte2       = await nstream.ReadAsyncEx(consumerPortBytes);

            //Server.Logger.Debug("consumerPortBytes received.");
            if (resultByte2 < 1)
            {
                CloseClient(client);
                return(true);
            }

            //NSPClient nspClient;
            //3.分配配置ID,并且写回给客户端
            try
            {
                byte[] arrangedIds = ConnectionManager.ArrangeConfigIds(appRequestBytes, consumerPortBytes, clientIdFromToken);
                Server.Logger.Debug("apprequest arranged");
                await nstream.WriteAsync(arrangedIds);
            }
            catch (Exception ex)
            {
                await nstream.WriteAsync(new byte[] { (byte)ServerStatus.UnknowndFailed });

                //TODO 2 服务端错误:未知错误
                Logger.Debug(ex.ToString());
            }
            finally
            {
                client.Close();
            }

            ////4.给NSPClient关联configclient
            //nspClient.LastUpdateTime
            Logger.Debug("arrangedIds written.");

            return(false);
        }
Exemple #2
0
        private async Task <bool> ProcessAppRequestProtocol(TcpClient client, bool IsReconnect = false)
        {
            Server.Logger.Debug("Now processing request protocol....");
            NetworkStream nstream           = client.GetStream();
            int           clientIdFromToken = 0;

            //1.读取配置请求1
            //如果是重连请求,则读取接下来5个字符,清
            //空服务端所有与该client相关的所有连接配置

            //TODO !!!!兼容原有的重连逻辑

            //TODO !!!!获取Token,截取clientID,校验
            //TODO !!!!这里的校验逻辑和httpserver_api存在太多重复,需要重构
            clientIdFromToken = await GetClientIdFromNextTokenBytes(client);

            //var userClaims = StringUtil.ConvertStringToTokenClaims(clientIdFromToken);
            if (clientIdFromToken == 0)
            {
                client.Close();
                return(false);
            }

            //if (IsReconnect) 因为加入了始终校验的机制,取消重连规则
            //{
            ServerContext.CloseAllSourceByClient(clientIdFromToken);
            // }

            //1.3 获取客户端请求数
            int configRequestLength = 3;

            byte[] appRequestBytes = new byte[configRequestLength];
            int    resultByte      = await nstream.ReadAsync(appRequestBytes);

            Server.Logger.Debug("appRequestBytes received.");
            if (resultByte == 0)
            {
                CloseClient(client);
                return(true);
            }

            //2.根据配置请求1获取更多配置信息
            int appCount = (int)appRequestBytes[2];

            byte[] consumerPortBytes = new byte[appCount * 2];
            int    resultByte2       = await nstream.ReadAsync(consumerPortBytes);

            Server.Logger.Debug("consumerPortBytes received.");
            if (resultByte2 == 0)
            {
                CloseClient(client);
                return(true);
            }

            //NSPClient nspClient;
            //3.分配配置ID,并且写回给客户端
            try
            {
                byte[] arrangedIds = ConnectionManager.ArrangeConfigIds(appRequestBytes, consumerPortBytes, clientIdFromToken);
                Server.Logger.Debug("apprequest arranged");
                await nstream.WriteAsync(arrangedIds);
            }
            catch (Exception ex)
            {
                Logger.Debug(ex.ToString());
            }
            finally
            {
                client.Close();
            }

            ////4.给NSPClient关联configclient
            //nspClient.LastUpdateTime
            Logger.Debug("arrangedIds written.");

            return(false);
        }