public static void Stop() { NATServer?.Stop(); HttpServerList.ForEach(c => c.Stop()); TcpServerList.ForEach(c => c.Stop()); MapList.Clear(); }
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}"); } } }
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}"); } }
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}"); } }
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}"); } }); }
public void Stop() { HttpServerList.ForEach(c => c.Stop()); TcpServerList.ForEach(c => c.Stop()); }
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}"); } }); }
public void Stop() { NATServer?.Stop(); HttpServerList?.ForEach(c => c.Stop()); TcpServerList?.ForEach(c => c.Stop()); }