增加Host以及依赖注入

This commit is contained in:
SpringHgui 2020-01-02 23:59:31 +08:00
parent 649aec5cc3
commit 3b448a7440
11 changed files with 168 additions and 71 deletions

View File

@ -12,6 +12,9 @@
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.1.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.1.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="3.1.0" />
<PackageReference Include="NLog" Version="4.6.8" />
<PackageReference Include="NLog.Extensions.Logging" Version="1.6.1" />
<PackageReference Include="NLog" Version="4.6.8" />
</ItemGroup>
<ItemGroup>
@ -22,6 +25,9 @@
<None Update="appsettings.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Nlog.config">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
<ProjectExtensions><VisualStudio><UserProperties appsettings_1json__JsonSchema="" /></VisualStudio></ProjectExtensions>

View File

@ -10,6 +10,9 @@ using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using NLog;
using FastTunnel.Core.Host;
using FastTunnel.Core.Config;
namespace FastTunnel.Client
{
@ -18,26 +21,58 @@ namespace FastTunnel.Client
static void Main(string[] args)
{
Console.WriteLine("Client Start!");
var logger = LogManager.GetCurrentClassLogger();
var conf = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", true, true)
.Build();
try
{
var servicesProvider = new Host().Config(Config).Build();
Run(servicesProvider);
var settings = conf.Get<Appsettings>();
Run(settings);
while (true)
{
Thread.Sleep(10000 * 60);
}
}
catch (Exception ex)
{
// NLog: catch any exception and log it.
logger.Error(ex, "Stopped program because of exception");
throw;
}
finally
{
// Ensure to flush and stop internal timers/threads before application-exit (Avoid segmentation fault on Linux)
LogManager.Shutdown();
}
}
private static void Run(Appsettings settings)
private static void Run(IServiceProvider servicesProvider)
{
var FastTunnelClient = new FastTunnelClient(settings.ClientSettings, new ConsoleLogger());
FastTunnelClient.Login();
var client = servicesProvider.GetRequiredService<FastTunnelClient>();
client.Login();
while (true)
{
Thread.Sleep(10000 * 60);
}
}
private static void Config(ServiceCollection service)
{
service.AddTransient<FastTunnelClient>()
.AddSingleton<ClientConfig>(implementationFactory);
}
private static ClientConfig implementationFactory(IServiceProvider arg)
{
var conf = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", true, true)
.Build();
var settings = conf.Get<Appsettings>();
return settings.ClientSettings;
}
}
}

View File

@ -12,6 +12,7 @@ using System.Threading.Tasks;
using FastTunnel.Core.Extensions;
using System.Timers;
using System.Threading;
using Microsoft.Extensions.Logging;
namespace FastTunnel.Core.Client
{
@ -21,7 +22,7 @@ namespace FastTunnel.Core.Client
Connecter _client;
ILogger _logger;
ILogger<FastTunnelClient> _logger;
System.Timers.Timer timer_timeout;
System.Timers.Timer timer_heart;
@ -30,7 +31,7 @@ namespace FastTunnel.Core.Client
DateTime lastHeart;
Thread th;
public FastTunnelClient(ClientConfig clientConfig, ILogger logger)
public FastTunnelClient(ClientConfig clientConfig, ILogger<FastTunnelClient> logger)
{
_logger = logger;
_clientConfig = clientConfig;
@ -60,7 +61,7 @@ namespace FastTunnel.Core.Client
var span = (DateTime.Now - lastHeart).TotalMilliseconds;
if (span > timer.Interval)
{
_logger.Debug($"上次心跳时间为{span}ms前");
_logger.LogDebug($"上次心跳时间为{span}ms前");
// 重新登录
reConnect();
@ -81,7 +82,7 @@ namespace FastTunnel.Core.Client
}
catch (Exception ex)
{
_logger.Error(ex.Message);
_logger.LogError(ex.Message);
}
}
@ -99,18 +100,18 @@ namespace FastTunnel.Core.Client
}
catch (Exception ex)
{
_logger.Error(ex);
_logger.LogError(ex);
}
finally
{
_client.Socket.Close();
_logger.Debug("已退出登录\n");
_logger.LogDebug("已退出登录\n");
}
}
public void Login()
{
_logger.Debug("登录中...");
_logger.LogDebug("登录中...");
//连接到的目标IP
try
@ -120,7 +121,7 @@ namespace FastTunnel.Core.Client
}
catch (Exception ex)
{
_logger.Error(ex.Message);
_logger.LogError(ex.Message);
_client.Socket.Close();
Thread.Sleep(5000);
@ -130,7 +131,7 @@ namespace FastTunnel.Core.Client
// 登录
_client.Send(new Message<LogInRequest> { MessageType = MessageType.C_LogIn, Content = new LogInRequest { ClientConfig = _clientConfig } });
_logger.Debug("登录成功");
_logger.LogDebug("登录成功");
// 心跳开始
timer_heart.Start();
@ -192,7 +193,7 @@ namespace FastTunnel.Core.Client
}
catch (Exception ex)
{
_logger.Error(ex.Message);
_logger.LogError(ex.Message);
continue;
}
}
@ -234,15 +235,15 @@ namespace FastTunnel.Core.Client
break;
case MessageType.Info:
var info = Msg.Content.ToJson();
_logger.Info(info);
_logger.LogInformation(info);
break;
case MessageType.Debug:
var debug = Msg.Content.ToJson();
_logger.Debug(debug);
case MessageType.LogDebug:
var LogDebug = Msg.Content.ToJson();
_logger.LogDebug(LogDebug);
break;
case MessageType.Error:
var err = Msg.Content.ToJson();
_logger.Error(err);
_logger.LogError(err);
break;
case MessageType.C_SwapMsg:
case MessageType.C_LogIn:
@ -252,8 +253,8 @@ namespace FastTunnel.Core.Client
}
catch (Exception ex)
{
_logger.Error(ex);
_logger.Error(words);
_logger.LogError(ex);
_logger.LogError(words);
}
}
}

View File

@ -8,7 +8,16 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Configuration" Version="3.1.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="3.1.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.1.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="3.1.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="3.1.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="3.1.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.1.0" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
<PackageReference Include="NLog" Version="4.6.8" />
<PackageReference Include="NLog.Extensions.Logging" Version="1.6.1" />
</ItemGroup>
</Project>

View File

@ -1,16 +1,18 @@
using FastTunnel.Core.Logger;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using FastTunnel.Core.Extensions;
namespace FastTunnel.Core
{
public class Listener<T>
{
ILogger _logerr;
ILogger<object> _logerr;
public string IP { get; set; }
@ -21,7 +23,7 @@ namespace FastTunnel.Core
T _data;
public Listener(string ip, int port, ILogger logerr, Action<Socket, T> acceptCustomerHandler, T data)
public Listener(string ip, int port, ILogger<object> logerr, Action<Socket, T> acceptCustomerHandler, T data)
{
_logerr = logerr;
_data = data;
@ -58,7 +60,7 @@ namespace FastTunnel.Core
}
catch (Exception ex)
{
_logerr.Error(ex);
_logerr.LogError(ex);
throw;
}
}
@ -84,7 +86,7 @@ namespace FastTunnel.Core
finally
{
ls.Close();
_logerr.Debug("Listener closed");
_logerr.LogDebug("Listener closed");
}
}
}

View File

@ -11,7 +11,7 @@ namespace FastTunnel.Core.Logger
Console.WriteLine(string.Format("Erro - {0}", msg?.ToString()));
}
public void Debug(string msg)
public void LogDebug(string msg)
{
Console.WriteLine(string.Format("Debu - {0}", msg));
}

View File

@ -12,7 +12,7 @@ namespace FastTunnel.Core.Logger
void Warning(string msg);
void Debug(string msg);
void LogDebug(string msg);
void Info(string msg);
}

View File

@ -25,7 +25,7 @@ namespace FastTunnel.Core.Models
// twoway
Info,
Debug,
LogDebug,
Error
}

View File

@ -12,6 +12,7 @@ using System.Net.Sockets;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
namespace FastTunnel.Core.Server
{
@ -22,9 +23,9 @@ namespace FastTunnel.Core.Server
Dictionary<string, NewRequest> newRequest = new Dictionary<string, NewRequest>();
private ServerConfig serverSettings;
ILogger _logger;
ILogger<FastTunnelServer> _logger;
public FastTunnelServer(ServerConfig serverSettings, ILogger logger)
public FastTunnelServer(ServerConfig serverSettings, ILogger<FastTunnelServer> logger)
{
_logger = logger;
this.serverSettings = serverSettings;
@ -40,7 +41,7 @@ namespace FastTunnel.Core.Server
{
var listener = new Listener<object>(serverSettings.BindAddr, serverSettings.BindPort, _logger, ReceiveClient, null);
listener.Listen();
_logger.Debug($"监听客户端 -> {serverSettings.BindAddr}:{serverSettings.BindPort}");
_logger.LogDebug($"监听客户端 -> {serverSettings.BindAddr}:{serverSettings.BindPort}");
}
private void ListenCustomer()
@ -48,13 +49,13 @@ namespace FastTunnel.Core.Server
var listener = new Listener<object>(serverSettings.BindAddr, serverSettings.ProxyPort_HTTP, _logger, ReceiveCustomer, null);
listener.Listen();
_logger.Debug($"监听HTTP -> {serverSettings.BindAddr}:{serverSettings.ProxyPort_HTTP}");
_logger.LogDebug($"监听HTTP -> {serverSettings.BindAddr}:{serverSettings.ProxyPort_HTTP}");
}
//接收消息
void ReceiveCustomer(Socket client, object _)
{
_logger.Debug("新的HTTP请求");
_logger.LogDebug("新的HTTP请求");
try
{
@ -73,7 +74,7 @@ namespace FastTunnel.Core.Server
}
catch (SocketException ex)
{
_logger.Error(ex);
_logger.LogError(ex.Message);
if (client.Connected)
client.Close();
return;
@ -92,7 +93,7 @@ namespace FastTunnel.Core.Server
var collection = Regex.Matches(words, pattern);
if (collection.Count == 0)
{
_logger.Error($"Host异常{words}");
_logger.LogError($"Host异常{words}");
return;
}
else
@ -102,18 +103,18 @@ namespace FastTunnel.Core.Server
var domain = Host.Split(":")[1].Trim();
_logger.Debug($"Host: {domain}");
_logger.LogDebug($"Host: {domain}");
WebInfo web;
if (!WebList.TryGetValue(domain, out web))
{
_logger.Error($"客户端不存在:'{domain}'");
_logger.LogError($"客户端不存在:'{domain}'");
return;
}
if (!web.Socket.Connected)
{
_logger.Error($"客户端已下线:'{domain}'");
_logger.LogError($"客户端已下线:'{domain}'");
WebList.Remove(domain);
return;
}
@ -133,7 +134,7 @@ namespace FastTunnel.Core.Server
}
catch (Exception ex)
{
_logger.Error(ex);
_logger.LogError(ex);
}
}
@ -150,7 +151,7 @@ namespace FastTunnel.Core.Server
}
catch (Exception ex)
{
_logger.Error(ex);
_logger.LogError(ex);
if (client.Connected)
{
client.Close();
@ -162,7 +163,7 @@ namespace FastTunnel.Core.Server
string words = Encoding.UTF8.GetString(buffer, 0, length);
var msg = JsonConvert.DeserializeObject<Message<object>>(words);
_logger.Debug($"收到客户端指令:{msg.MessageType}");
_logger.LogDebug($"收到客户端指令:{msg.MessageType}");
switch (msg.MessageType)
{
case MessageType.C_LogIn:
@ -188,7 +189,7 @@ namespace FastTunnel.Core.Server
else
{
// 未找到,关闭连接
_logger.Error($"未找到请求:{msgId}");
_logger.LogError($"未找到请求:{msgId}");
client.Send(new Message<string> { MessageType = MessageType.Error, Content = $"未找到请求:{msgId}" });
}
break;
@ -208,14 +209,14 @@ namespace FastTunnel.Core.Server
var hostName = $"{item.SubDomain}.{serverSettings.Domain}".Trim();
if (WebList.ContainsKey(hostName))
{
_logger.Debug($"renew domain '{hostName}'");
_logger.LogDebug($"renew domain '{hostName}'");
WebList.Remove(hostName);
WebList.Add(hostName, new WebInfo { Socket = client, WebConfig = item });
}
else
{
_logger.Debug($"new domain '{hostName}'");
_logger.LogDebug($"new domain '{hostName}'");
WebList.Add(hostName, new WebInfo { Socket = client, WebConfig = item });
}
@ -231,20 +232,20 @@ namespace FastTunnel.Core.Server
{
if (item.RemotePort.Equals(serverSettings.BindPort))
{
_logger.Error($"RemotePort can not be same with BindPort: {item.RemotePort}");
_logger.LogError($"RemotePort can not be same with BindPort: {item.RemotePort}");
continue;
}
if (item.RemotePort.Equals(serverSettings.ProxyPort_HTTP))
{
_logger.Error($"RemotePort can not be same with ProxyPort_HTTP: {item.RemotePort}");
_logger.LogError($"RemotePort can not be same with ProxyPort_HTTP: {item.RemotePort}");
continue;
}
SSHInfo<SSHHandlerArg> old;
if (SSHList.TryGetValue(item.RemotePort, out old))
{
_logger.Debug($"Remove Listener {old.Listener.IP}:{old.Listener.Port}");
_logger.LogDebug($"Remove Listener {old.Listener.IP}:{old.Listener.Port}");
old.Listener.ShutdownAndClose();
SSHList.Remove(item.RemotePort);
}
@ -254,12 +255,12 @@ namespace FastTunnel.Core.Server
// listen success
SSHList.Add(item.RemotePort, new SSHInfo<SSHHandlerArg> { Listener = ls, Socket = client, SSHConfig = item });
_logger.Debug($"SSH proxy success: {item.RemotePort} -> {item.LocalIp}:{item.LocalPort}");
_logger.LogDebug($"SSH proxy success: {item.RemotePort} -> {item.LocalIp}:{item.LocalPort}");
}
catch (Exception ex)
{
_logger.Error($"SSH proxy error: {item.RemotePort} -> {item.LocalIp}:{item.LocalPort}");
_logger.Error(ex);
_logger.LogError($"SSH proxy error: {item.RemotePort} -> {item.LocalIp}:{item.LocalPort}");
_logger.LogError(ex.Message);
client.Send(new Message<string> { MessageType = MessageType.Error, Content = ex.Message });
continue;
}

View File

@ -1,5 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
@ -10,6 +9,9 @@
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="3.1.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="3.1.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.1.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.1.0" />
<PackageReference Include="NLog" Version="4.6.8" />
<PackageReference Include="NLog.Extensions.Logging" Version="1.6.1" />
</ItemGroup>
<ItemGroup>
@ -20,6 +22,9 @@
<None Update="appsettings.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Nlog.config">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>

View File

@ -11,34 +11,72 @@ using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using NLog.Extensions.Logging;
using Microsoft.Extensions.Logging;
using NLog;
using FastTunnel.Core.Config;
using FastTunnel.Core.Host;
namespace FastTunnel.Server
{
class Program
{
static Appsettings appsettings;
static void Main(string[] args)
{
Console.WriteLine("Server Start!");
var logger = LogManager.GetCurrentClassLogger();
var conf = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", true, true)
.Build();
try
{
var servicesProvider = new Host().Config(Config).Build();
Run(servicesProvider);
var settings = conf.Get<Appsettings>();
Run(settings);
while (true)
{
Thread.Sleep(10000 * 60);
}
}
catch (Exception ex)
{
// NLog: catch any exception and log it.
logger.Error(ex, "Stopped program because of exception");
throw;
}
finally
{
// Ensure to flush and stop internal timers/threads before application-exit (Avoid segmentation fault on Linux)
LogManager.Shutdown();
}
}
private static void Run(Appsettings settings)
private static ServerConfig implementationFactory(IServiceProvider arg)
{
var logger = new ConsoleLogger();
var server = new FastTunnelServer(settings.ServerSettings, logger);
server.Run();
while (true)
if (appsettings == null)
{
Thread.Sleep(10000 * 60);
var conf = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", true, true)
.Build();
appsettings = conf.Get<Appsettings>();
}
return appsettings.ServerSettings;
}
private static void Config(ServiceCollection service)
{
service.AddTransient<FastTunnelServer>()
.AddSingleton<ServerConfig>(implementationFactory);
}
private static void Run(IServiceProvider servicesProvider)
{
var server = servicesProvider.GetRequiredService<FastTunnelServer>();
server.Run();
}
}
}