예제 #1
0
 public static void Stop()
 {
     NATServer?.Stop();
     HttpServerList.ForEach(c => c.Stop());
     TcpServerList.ForEach(c => c.Stop());
     MapList.Clear();
 }
예제 #2
0
 private static void StartWebServer(Common.Models.ServerConfig serverConfig)
 {
     if (serverConfig.port_list.Any())
     {
         var server = new HttpAppServer()
         {
             ServerConfig = serverConfig
         };
         bool setup = server.Setup(new RootConfig()
         {
             DisablePerformanceDataCollector = true
         }, new CSuperSocket.SocketBase.Config.ServerConfig()
         {
             Listeners = from s in serverConfig.port_list
                         select new ListenerConfig
             {
                 Ip   = "Any",
                 Port = s
             },            //批量监听
             TextEncoding            = "ASCII",
             MaxRequestLength        = 102400,
             MaxConnectionNumber     = 1000,
             ReceiveBufferSize       = 102400,
             SendBufferSize          = 102400,
             LogBasicSessionActivity = true,
             LogAllSocketException   = true,
             SyncSend    = false,
             Security    = serverConfig.ssl_type == null ? null : Enum.GetName(typeof(ssl_type), serverConfig.ssl_type),
             Certificate = serverConfig.ssl_type == null ? null : new CertificateConfig()
             {
                 FilePath = string.IsNullOrEmpty(serverConfig.certfile) ? CertFile : serverConfig.certfile,
                 Password = string.IsNullOrEmpty(serverConfig.certpwd) ? CertPassword : serverConfig.certpwd,
                 ClientCertificateRequired = false
             },
             DisableSessionSnapshot  = true,
             SessionSnapshotInterval = 1
         });
         if (setup)
         {
             var start = server.Start();
             if (start)
             {
                 server.NewSessionConnected += WebServer_NewSessionConnected;
                 server.NewRequestReceived  += WebServer_NewRequestReceived;
                 server.SessionClosed       += WebServer_SessionClosed;
                 HttpServerList.Add(server);
                 HandleLog.WriteLine($"{serverConfig.protocol}服务启动成功,监听端口:{serverConfig.port}");
             }
             else
             {
                 HandleLog.WriteLine($"{serverConfig.protocol}服务启动失败,端口:{serverConfig.port}");
             }
         }
         else
         {
             HandleLog.WriteLine($"{serverConfig.protocol}服务初始化失败,端口:{serverConfig.port}");
         }
     }
 }
예제 #3
0
        private static void StartHttpsServer(ServerConfig serverConfig)
        {
            try
            {
                foreach (var port in serverConfig.port_list)
                {
                    Task.Run(async() =>
                    {
                        var server = new HttpServer(new ServerOption()
                        {
                            Ip           = "Any",
                            Port         = port,
                            ProtocolType = ProtocolType.Tcp,
                            BackLog      = 100,
                            NoDelay      = true,
                            Security     = serverConfig.is_ssl ? SslProtocols.Tls12 : SslProtocols.None,
                            SslServerAuthenticationOptions = serverConfig.is_ssl ? new SslServerAuthenticationOptions
                            {
                                EnabledSslProtocols = SslProtocols.Tls12,
                                ServerCertificate   = new X509Certificate2(string.IsNullOrEmpty(serverConfig.certfile) ? GlobalConfig.CertFile : serverConfig.certfile, string.IsNullOrEmpty(serverConfig.certpwd) ? GlobalConfig.CertPassword : serverConfig.certpwd)
                            } : null
                        });

                        var res = await server.StartAysnc();
                        if (res)
                        {
                            HttpServerList.Add(server);
                            LogHelper.Info($"{serverConfig.protocol}服务启动成功,监听端口:{port}");
                        }
                        else
                        {
                            LogHelper.Error($"{serverConfig.protocol}服务启动失败,监听端口:{port}");
                        }
                    });
                }
            }
            catch (Exception ex)
            {
                LogHelper.Error($"{serverConfig.protocol}服务初始化失败,端口:{serverConfig.port},{ex}");
            }
        }
예제 #4
0
        private static void StartHttpServer(ServerConfig serverConfig)
        {
            try
            {
                foreach (var port in serverConfig.port_list)
                {
                    var server = new HttpServer(port)
                    {
                        NATServer = NATServer
                    };
                    server.Start();
                    HttpServerList.Add(server);
                }

                HandleLog.WriteLine($"{serverConfig.protocol}服务启动成功,监听端口:{serverConfig.port}");
            }
            catch (Exception ex)
            {
                HandleLog.WriteLine($"{serverConfig.protocol}服务初始化失败,端口:{serverConfig.port},{ex}");
            }
        }
예제 #5
0
        private static void Received(NatSession session, NatRequestInfo requestInfo)
        {
            Task.Run(() =>
            {
                try
                {
                    switch (requestInfo.Body.Type)
                    {
                    case (byte)JsonType.NAT:
                        {
                            LogHelper.Info($"NAT收到数据:{requestInfo.Raw.ToHexWithSpace()},正文内容: {requestInfo.Body.ToJson()}", false);
                            NATServer.ProcessData(session, requestInfo);
                            break;
                        }

                    case (byte)JsonType.HTTP:
                        {
                            var httpModel = requestInfo.Body.Data.FromJson <HttpModel>();
                            var server    = HttpServerList.Find(c => c.ServerId == httpModel.ServerId);
                            server?.ProcessData(session, requestInfo, httpModel);
                            break;
                        }

                    case (byte)JsonType.TCP:
                        {
                            var tcpModel = requestInfo.Body.Data.FromJson <TcpModel>();
                            var server   = TcpServerList.Find(c => c.ServerId == tcpModel.ServerId);
                            server?.ProcessData(session, requestInfo, tcpModel);
                            break;
                        }
                    }
                }
                catch (Exception ex)
                {
                    LogHelper.Error($"穿透传输连接【{session.RemoteEndPoint},{session.Client?.name}】响应请求异常:{ex}");
                }
            });
        }
예제 #6
0
 public void Stop()
 {
     HttpServerList.ForEach(c => c.Stop());
     TcpServerList.ForEach(c => c.Stop());
 }
예제 #7
0
        private static void NATServer_NewRequestReceived(NatAppSession session, NatRequestInfo requestInfo)
        {
            Task.Run(() =>
            {
                try
                {
                    //HandleLog.WriteLine($"NAT服务收到数据:{requestInfo.Hex}");
                    if (requestInfo.Mode == 0x1)//nat
                    {
                        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 checkSessions = NATServer.GetSessions(c => c.Client?.secret == secret).ToList();
                                if (checkSessions.Any())
                                {
                                    checkSessions.ForEach(c =>
                                    {
                                        session.SendMsg($"您的密钥已被主机{client.name},{session.RemoteEndPoint}使用,已强制下线!!");
                                        Thread.Sleep(500);
                                        c.Close();
                                    });
                                }
                                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;
                        }
                    }
                    else if (requestInfo.Mode == 0x2)//http
                    {
                        var packJson = JsonHelper.Instance.Deserialize <PackJson>(requestInfo.BodyRaw);
                        switch (requestInfo.FunCode)
                        {
                        case 0x1:
                            {
                                //02 01 数据长度(4) 正文数据(n)   ---http响应包
                                int count = 0;
                                mark:
                                var webSession = HttpServerList.SelectMany(c => c.GetAllSessions()).Where(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 res      = webSession.TrySend(response, 0, response.Length);
                                HandleLog.WriteLine($"{packJson.ResponseInfo} {Math.Ceiling((DateTime.Now - webSession.RequestTime).Value.TotalMilliseconds)}ms");
                            }
                            break;
                        }
                    }
                    else if (requestInfo.Mode == 0x3)//tcp
                    {
                        var packJson = JsonHelper.Instance.Deserialize <PackJson>(requestInfo.BodyRaw);
                        switch (requestInfo.FunCode)
                        {
                        case 0x2:
                            {
                                //响应请求
                                int count = 0;
                                mark:
                                var tcpSession = TcpServerList.SelectMany(c => c.GetAllSessions()).Where(c => c.UserId.ToLower() == packJson.UserId.ToLower()).FirstOrDefault();
                                if (tcpSession == null)
                                {
                                    count++;
                                    Thread.Sleep(500);
                                    if (count < 5)
                                    {
                                        goto mark;
                                    }
                                    HandleLog.WriteLine($"tcpSession【{packJson.UserId}】不存在");
                                    return;
                                }
                                //先讲16进制字符串转为byte数组  再gzip解压
                                var response = DataHelper.Decompress(packJson.Content);
                                tcpSession.Send(response, 0, response.Length);
                                HandleLog.WriteLine($"----> {tcpSession.PackJson.UserId} 发送报文{response.Length}字节");
                            }
                            break;

                        case 0x3:
                            {
                                //响应请求
                                var tcpSession = TcpServerList.SelectMany(c => c.GetAllSessions()).Where(c => c.UserId.ToLower() == packJson.UserId.ToLower()).FirstOrDefault();
                                if (tcpSession != null)
                                {
                                    tcpSession.Close();
                                    HandleLog.WriteLine($"连接【{tcpSession.PackJson.UserId},{tcpSession.RemoteEndPoint}】关闭成功");
                                }
                            }
                            break;
                        }
                    }
                }
                catch (Exception ex)
                {
                    HandleLog.WriteLine($"穿透传输连接【{session.RemoteEndPoint},{session.Client?.name}】响应请求异常:{ex}");
                }
            });
        }
예제 #8
0
 public void Stop()
 {
     NATServer?.Stop();
     HttpServerList?.ForEach(c => c.Stop());
     TcpServerList?.ForEach(c => c.Stop());
 }