Esempio n. 1
0
        public void ProcessData(NatSession session, NatRequestInfo requestInfo)
        {
            try
            {
                switch (requestInfo.Body.Action)
                {
                case (int)NatAction.Connect:
                {
                    //注册包
                    var secret = requestInfo.Body.Data.ToString();
                    HandleLog.WriteLine($"收到连接{session.Remote}的注册包,密钥为:{secret},当前映射个数:{session.MapList.Count}", false);
                    var bll    = new ClientBll();
                    var client = bll.GetOne(secret).Data;
                    if (client == null)
                    {
                        HandleLog.WriteLine($"主机【{session.Remote}】密钥不正确!!");
                        SendServerMessage(session, new ServerMessage()
                            {
                                Message = "主机密钥不正确,请确认是否填写正确!"
                            });
                        return;
                    }
                    var checkSessions = GetList(c => c.Client?.secret == secret && c.SessionId != session.SessionId);
                    if (checkSessions.Any())
                    {
                        checkSessions.ForEach(c =>
                            {
                                SendServerMessage(c, new ServerMessage()
                                {
                                    Message = "该主机密钥已被其它主机使用,您已被迫下线!"
                                });
                                Thread.Sleep(500);
                                c.Close();
                            });
                    }

                    var mapBll = new MapBll();
                    session.MapList = mapBll.GetMapList(secret).Data ?? new List <Map>();
                    client.MapList  = session.MapList;
                    session.Client  = client;
                    //原样返回回复客户端注册成功
                    requestInfo.Body.Data = client.ToJson();
                    session.Send(PackHelper.CreatePack(requestInfo.Body));
                    Task.Run(() =>
                        {
                            //更新在线状态
                            var bll       = new ClientBll();
                            var updateRst = bll.UpdateOnlineStatus(new Client()
                            {
                                secret = session.Client.secret, is_online = true, last_heart_time = DateTime.Now
                            });
                            HandleLog.WriteLine($"更新主机【{session.Client.name}】在线状态结果:{updateRst.Message}", false);
                        });
                }
                break;

                case (int)NatAction.Heart:
                {
                    //心跳包
                    var secret = requestInfo.Body.Data.ToString();
                    HandleLog.WriteLine($"收到连接{session.Remote}的心跳包,密钥为:{secret},当前映射个数:{session.MapList.Count}", false);
                    Task.Run(() =>
                        {
                            //更新在线状态
                            var bll       = new ClientBll();
                            var updateRst = bll.UpdateOnlineStatus(new Client()
                            {
                                secret = session.Client.secret, is_online = true, last_heart_time = DateTime.Now
                            });
                            HandleLog.WriteLine($"更新主机【{session.Client.name}】在线状态结果:{updateRst.Message}", false);
                        });
                }
                break;
                }
            }
            catch (Exception ex)
            {
                HandleLog.WriteLine($"穿透处理异常,{ex}");
            }
        }
Esempio n. 2
0
        private static void NATServer_NewRequestReceived(NatAppSession session, NatRequestInfo requestInfo)
        {
            try
            {
                //HandleLog.WriteLine($"NAT服务收到数据:{requestInfo.Hex}");
                switch (requestInfo.FunCode)
                {
                case 0x1:
                {
                    //注册包
                    var secret = requestInfo.BodyRaw;
                    using var bll = new ClientBll();
                    var client = bll.GetOne(secret).Data;
                    if (client == null)
                    {
                        HandleLog.WriteLine($"主机【{session.RemoteEndPoint}】密钥不正确!!");
                        session.SendMsg("主机密钥不正确,请确认是否填写正确!");
                        return;
                    }
                    var checkSession = NATServer.GetSessions(c => c.Client?.secret == secret).FirstOrDefault();
                    if (checkSession != null)
                    {
                        session.SendMsg($"密钥{secret}已被主机:{checkSession.Client.name},{checkSession.RemoteEndPoint}使用!");
                        return;
                    }
                    session.Client = client;

                    using var mapBll = new MapBll();
                    session.MapList  = mapBll.GetMapList(secret).Data ?? new List <Map>();
                    //原样返回回复客户端注册成功
                    session.Send(requestInfo.Data);
                    Task.Run(() =>
                        {
                            //更新在线状态
                            using var bll = new ClientBll();
                            var updateRst = bll.UpdateOnlineStatus(new Client()
                            {
                                secret = session.Client.secret, is_online = true, last_heart_time = DateTime.Now
                            });
                            HandleLog.WriteLine($"更新主机【{session.Client.name}】在线状态结果:{updateRst.Message}", false);
                        });
                }
                break;

                case 0x2:
                {
                    //心跳包
                    var secret = requestInfo.BodyRaw;
                    HandleLog.WriteLine($"收到连接{session.RemoteEndPoint}的心跳包,密钥为:{secret},当前映射个数:{session.MapList.Count}", false);
                    Task.Run(() =>
                        {
                            //更新在线状态
                            using var bll = new ClientBll();
                            var updateRst = bll.UpdateOnlineStatus(new Client()
                            {
                                secret = session.Client.secret, is_online = true, last_heart_time = DateTime.Now
                            });
                            HandleLog.WriteLine($"更新主机【{session.Client.name}】在线状态结果:{updateRst.Message}", false);
                        });
                }
                break;

                case 0x3:
                {
                    //响应请求
                    var packJson = JsonHelper.Instance.Deserialize <PackJson>(requestInfo.BodyRaw);
                    int count    = 0;
mark:
                    var webSession = HttpServer.GetSessions(c => c.UserId.ToLower() == packJson.UserId.ToLower()).FirstOrDefault();
                    if (webSession == null)
                    {
                        count++;
                        Thread.Sleep(500);
                        if (count < 5)
                        {
                            goto mark;
                        }
                        HandleLog.WriteLine($"webSession【{packJson.UserId}】不存在");
                        return;
                    }
                    //先讲16进制字符串转为byte数组  再gzip解压
                    var response    = DataHelper.Decompress(packJson.Content);
                    var rawResponse = Encoding.UTF8.GetString(response);
                    var res         = webSession.TrySend(response, 0, response.Length);
                    HandleLog.WriteLine($"{packJson.ResponseInfo} {Math.Ceiling((DateTime.Now - webSession.RequestTime).Value.TotalMilliseconds)}ms");
                    //webSession?.Close();
                }
                break;
                }
            }
            catch (Exception ex)
            {
                HandleLog.WriteLine($"webSession响应请求异常:{ex}");
            }
        }