mirror of
https://github.com/FastTunnel/FastTunnel.git
synced 2025-02-08 02:39:29 +08:00
抽象处理接口,统一消息发送
This commit is contained in:
parent
f899be5dc2
commit
e83ccc4ac2
|
@ -13,6 +13,7 @@ using FastTunnel.Core.Host;
|
|||
using FastTunnel.Core.Config;
|
||||
using FastTunnel.Core.Core;
|
||||
using FastTunnel.Core.Models;
|
||||
using FastTunnel.Core.Handlers.Client;
|
||||
|
||||
namespace FastTunnel.Client
|
||||
{
|
||||
|
@ -70,10 +71,10 @@ namespace FastTunnel.Client
|
|||
}
|
||||
|
||||
// 登录
|
||||
_client.Send(new Message<LogInRequest>
|
||||
_client.Send(new Message<LogInMassage>
|
||||
{
|
||||
MessageType = MessageType.C_LogIn,
|
||||
Content = new LogInRequest
|
||||
Content = new LogInMassage
|
||||
{
|
||||
Webs = config.Webs,
|
||||
SSH = config.SSH
|
||||
|
@ -91,7 +92,11 @@ namespace FastTunnel.Client
|
|||
|
||||
private static void Config(ServiceCollection service)
|
||||
{
|
||||
service.AddTransient<FastTunnelClient>()
|
||||
service.AddSingleton<FastTunnelClient>()
|
||||
.AddSingleton<ClientHeartHandler>()
|
||||
.AddSingleton<LogHandler>()
|
||||
.AddSingleton<NewCustomerHandler>()
|
||||
.AddSingleton<NewSSHHandler>()
|
||||
.AddSingleton<ClientConfig>(implementationFactory);
|
||||
}
|
||||
|
||||
|
|
|
@ -32,14 +32,10 @@ namespace FastTunnel.Core
|
|||
Socket.Connect(point);
|
||||
}
|
||||
|
||||
private void Send(string msg)
|
||||
{
|
||||
Socket.Send(Encoding.UTF8.GetBytes(msg));
|
||||
}
|
||||
|
||||
public void Send<T>(Message<T> msg)
|
||||
where T : TunnelMassage
|
||||
{
|
||||
Send(msg.ToJson());
|
||||
Socket.Send(msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -12,12 +12,13 @@ using FastTunnel.Core.Extensions;
|
|||
using System.Timers;
|
||||
using System.Threading;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using FastTunnel.Core.Handlers.Client;
|
||||
|
||||
namespace FastTunnel.Core.Core
|
||||
{
|
||||
public class FastTunnelClient
|
||||
{
|
||||
SuiDaoServer _serverConfig;
|
||||
public SuiDaoServer _serverConfig;
|
||||
|
||||
Connecter _client;
|
||||
|
||||
|
@ -28,44 +29,64 @@ namespace FastTunnel.Core.Core
|
|||
|
||||
Func<Connecter> login;
|
||||
double heartInterval = 10 * 1000; // 10 秒心跳
|
||||
DateTime lastHeart;
|
||||
public DateTime lastHeart;
|
||||
Thread th;
|
||||
|
||||
int reTrySpan = 30 * 1000; // 登陆失败后重试间隔
|
||||
NewCustomerHandler _newCustomerHandler;
|
||||
NewSSHHandler _newSSHHandler;
|
||||
LogHandler _logHandler;
|
||||
ClientHeartHandler _clientHeartHandler;
|
||||
|
||||
public FastTunnelClient(ILogger<FastTunnelClient> logger)
|
||||
public FastTunnelClient(ILogger<FastTunnelClient> logger, NewCustomerHandler newCustomerHandler, NewSSHHandler newSSHHandler, LogHandler logHandler, ClientHeartHandler clientHeartHandler)
|
||||
{
|
||||
_logger = logger;
|
||||
|
||||
_newCustomerHandler = newCustomerHandler;
|
||||
_newSSHHandler = newSSHHandler;
|
||||
_logHandler = logHandler;
|
||||
_clientHeartHandler = clientHeartHandler;
|
||||
initailTimer();
|
||||
}
|
||||
|
||||
private void initailTimer()
|
||||
{
|
||||
timer_heart = new System.Timers.Timer();
|
||||
timer_heart.AutoReset = true;
|
||||
timer_heart.AutoReset = false;
|
||||
timer_heart.Interval = heartInterval;
|
||||
timer_heart.Elapsed += HeartElapsed;
|
||||
|
||||
timer_timeout = new System.Timers.Timer();
|
||||
timer_timeout.AutoReset = true;
|
||||
timer_timeout.AutoReset = false;
|
||||
timer_timeout.Interval = heartInterval + heartInterval / 2;
|
||||
timer_timeout.Elapsed += TimeoutElapsed;
|
||||
}
|
||||
|
||||
private void TimeoutElapsed(object sender, ElapsedEventArgs e)
|
||||
{
|
||||
if (lastHeart == null)
|
||||
return;
|
||||
timer_timeout.Enabled = false;
|
||||
|
||||
var timer = sender as System.Timers.Timer;
|
||||
var span = (DateTime.Now - lastHeart).TotalMilliseconds;
|
||||
if (span > timer.Interval)
|
||||
try
|
||||
{
|
||||
_logger.LogDebug($"上次心跳时间为{span}ms前");
|
||||
if (lastHeart == null)
|
||||
return;
|
||||
|
||||
// 重新登录
|
||||
reConnect();
|
||||
var timer = sender as System.Timers.Timer;
|
||||
var span = (DateTime.Now - lastHeart).TotalMilliseconds;
|
||||
if (span > timer.Interval)
|
||||
{
|
||||
_logger.LogDebug($"上次心跳时间为{span}ms前");
|
||||
|
||||
// 重新登录
|
||||
reConnect();
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
timer_timeout.Enabled = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -90,14 +111,20 @@ namespace FastTunnel.Core.Core
|
|||
|
||||
private void HeartElapsed(object sender, ElapsedEventArgs e)
|
||||
{
|
||||
timer_heart.Enabled = false;
|
||||
|
||||
try
|
||||
{
|
||||
_client.Send(new Message<object> { MessageType = MessageType.Heart, Content = null });
|
||||
_client.Send(new Message<HeartMassage> { MessageType = MessageType.Heart, Content = null });
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex.Message);
|
||||
}
|
||||
finally
|
||||
{
|
||||
timer_heart.Enabled = true;
|
||||
}
|
||||
}
|
||||
|
||||
public void Login(Func<Connecter> fun, SuiDaoServer serverConfig)
|
||||
|
@ -214,77 +241,30 @@ namespace FastTunnel.Core.Core
|
|||
}
|
||||
}
|
||||
|
||||
private void HandleServerRequest(string words)
|
||||
private IClientHandler HandleServerRequest(string words)
|
||||
{
|
||||
Message<object> Msg;
|
||||
|
||||
try
|
||||
var Msg = JsonConvert.DeserializeObject<Message<JObject>>(words);
|
||||
IClientHandler handler;
|
||||
switch (Msg.MessageType)
|
||||
{
|
||||
Msg = JsonConvert.DeserializeObject<Message<object>>(words);
|
||||
switch (Msg.MessageType)
|
||||
{
|
||||
case MessageType.Heart:
|
||||
lastHeart = DateTime.Now;
|
||||
break;
|
||||
case MessageType.S_NewCustomer:
|
||||
var request = (Msg.Content as JObject).ToObject<NewCustomerRequest>();
|
||||
var connecter = new Connecter(_serverConfig.ServerAddr, _serverConfig.ServerPort);
|
||||
connecter.Connect();
|
||||
connecter.Send(new Message<SwapMsgModel> { MessageType = MessageType.C_SwapMsg, Content = new SwapMsgModel(request.MsgId) });
|
||||
|
||||
var localConnecter = new Connecter(request.WebConfig.LocalIp, request.WebConfig.LocalPort);
|
||||
localConnecter.Connect();
|
||||
|
||||
new SocketSwap(connecter.Socket, localConnecter.Socket).StartSwap();
|
||||
break;
|
||||
case MessageType.S_NewSSH:
|
||||
var request_ssh = (Msg.Content as JObject).ToObject<NewSSHRequest>();
|
||||
var connecter_ssh = new Connecter(_serverConfig.ServerAddr, _serverConfig.ServerPort);
|
||||
connecter_ssh.Connect();
|
||||
connecter_ssh.Send(new Message<SwapMsgModel> { MessageType = MessageType.C_SwapMsg, Content = new SwapMsgModel(request_ssh.MsgId) });
|
||||
|
||||
var localConnecter_ssh = new Connecter(request_ssh.SSHConfig.LocalIp, request_ssh.SSHConfig.LocalPort);
|
||||
localConnecter_ssh.Connect();
|
||||
|
||||
new SocketSwap(connecter_ssh.Socket, localConnecter_ssh.Socket).StartSwap();
|
||||
break;
|
||||
case MessageType.Log:
|
||||
try
|
||||
{
|
||||
var msg = (Msg.Content as JObject).ToObject<LogMsg>();
|
||||
|
||||
switch (msg.MsgType)
|
||||
{
|
||||
case LogMsgType.Info:
|
||||
_logger.LogInformation("From Server:" + msg.Msg);
|
||||
break;
|
||||
case LogMsgType.Error:
|
||||
_logger.LogError("From Server:" + msg.Msg);
|
||||
break;
|
||||
case LogMsgType.Debug:
|
||||
_logger.LogDebug("From Server:" + msg.Msg);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex);
|
||||
}
|
||||
break;
|
||||
case MessageType.C_SwapMsg:
|
||||
case MessageType.C_LogIn:
|
||||
default:
|
||||
_logger.LogError($"未处理的消息:{Msg.MessageType} {Msg.Content}");
|
||||
break;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex);
|
||||
_logger.LogError(words);
|
||||
case MessageType.Heart:
|
||||
handler = _clientHeartHandler;
|
||||
break;
|
||||
case MessageType.S_NewCustomer:
|
||||
handler = _newCustomerHandler;
|
||||
break;
|
||||
case MessageType.S_NewSSH:
|
||||
handler = _newSSHHandler;
|
||||
break;
|
||||
case MessageType.Log:
|
||||
handler = _logHandler;
|
||||
break;
|
||||
default:
|
||||
throw new Exception($"未处理的消息:{Msg.MessageType} {Msg.Content}");
|
||||
}
|
||||
|
||||
handler.HandlerMsg(this, Msg);
|
||||
return handler;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -13,6 +13,7 @@ using System.Text.RegularExpressions;
|
|||
using System.Threading.Tasks;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using FastTunnel.Core.Handlers;
|
||||
using FastTunnel.Core.Handlers.Server;
|
||||
|
||||
namespace FastTunnel.Core.Core
|
||||
{
|
||||
|
@ -26,12 +27,16 @@ namespace FastTunnel.Core.Core
|
|||
ILogger<FastTunnelServer> _logger;
|
||||
|
||||
LoginHandler _loginHandler;
|
||||
HeartHandler _heartHandler;
|
||||
SwapMsgHandler _swapMsgHandler;
|
||||
|
||||
public FastTunnelServer(ServerConfig settings, ILogger<FastTunnelServer> logger, LoginHandler loginHandler)
|
||||
public FastTunnelServer(ServerConfig settings, ILogger<FastTunnelServer> logger, LoginHandler loginHandler, HeartHandler heartHandler, SwapMsgHandler swapMsgHandler)
|
||||
{
|
||||
_serverSettings = settings;
|
||||
_logger = logger;
|
||||
_loginHandler = loginHandler;
|
||||
_heartHandler = heartHandler;
|
||||
_swapMsgHandler = swapMsgHandler;
|
||||
}
|
||||
|
||||
public void Run()
|
||||
|
@ -136,7 +141,7 @@ namespace FastTunnel.Core.Core
|
|||
Buffer = bytes
|
||||
});
|
||||
|
||||
web.Socket.Send(new Message<NewCustomerRequest> { MessageType = MessageType.S_NewCustomer, Content = new NewCustomerRequest { MsgId = msgid, WebConfig = web.WebConfig } });
|
||||
web.Socket.Send(new Message<NewCustomerMassage> { MessageType = MessageType.S_NewCustomer, Content = new NewCustomerMassage { MsgId = msgid, WebConfig = web.WebConfig } });
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
@ -144,10 +149,11 @@ namespace FastTunnel.Core.Core
|
|||
}
|
||||
}
|
||||
|
||||
byte[] buffer = new byte[1024 * 1024];
|
||||
|
||||
public void ReceiveClient(Socket client, object _)
|
||||
{
|
||||
//定义byte数组存放从客户端接收过来的数据
|
||||
byte[] buffer = new byte[1024 * 1024];
|
||||
int length;
|
||||
|
||||
try
|
||||
|
@ -183,33 +189,39 @@ namespace FastTunnel.Core.Core
|
|||
|
||||
try
|
||||
{
|
||||
HandleWords(words, client);
|
||||
if (HandleWords(words, client).NeedRecive)
|
||||
{
|
||||
// 递归
|
||||
ReceiveClient(client, _);
|
||||
return;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex);
|
||||
_logger.LogError($"收到客户端 words:{words}");
|
||||
_logger.LogError($"错误的消息内容:{words}");
|
||||
|
||||
// throw;
|
||||
client.Send(new Message<LogMsg>() { MessageType = MessageType.Log, Content = new LogMsg(LogMsgType.Error, ex.Message) });
|
||||
client.Send(new Message<LogMassage>() { MessageType = MessageType.Log, Content = new LogMassage(LogMsgType.Error, ex.Message) });
|
||||
}
|
||||
}
|
||||
|
||||
private void HandleWords(string words, Socket client)
|
||||
private IServerHandler HandleWords(string words, Socket client)
|
||||
{
|
||||
// 同时读到两个或多个指令
|
||||
var index = words.IndexOf("}{");
|
||||
if (index > 0)
|
||||
{
|
||||
_logger.LogError($"读到多个消息 {words}");
|
||||
var sub_words = words.Substring(0, index + 1);
|
||||
var left = words.Substring(index + 1);
|
||||
|
||||
handle(sub_words, client);
|
||||
HandleWords(left, client);
|
||||
return HandleWords(left, client);
|
||||
}
|
||||
else
|
||||
{
|
||||
handle(words, client);
|
||||
return handle(words, client);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -220,71 +232,21 @@ namespace FastTunnel.Core.Core
|
|||
IServerHandler handler = null;
|
||||
switch (msg.MessageType)
|
||||
{
|
||||
case MessageType.C_LogIn:
|
||||
case MessageType.C_LogIn: // 登录
|
||||
handler = _loginHandler;
|
||||
break;
|
||||
case MessageType.Heart:
|
||||
|
||||
case MessageType.Heart: // 心跳
|
||||
handler = _heartHandler;
|
||||
break;
|
||||
case MessageType.C_SwapMsg: // 交换数据
|
||||
handler = _swapMsgHandler;
|
||||
break;
|
||||
case MessageType.C_SwapMsg:
|
||||
case MessageType.S_NewCustomer:
|
||||
case MessageType.S_NewSSH:
|
||||
default:
|
||||
handler = null;
|
||||
break;
|
||||
throw new Exception($"未知的通讯指令 {msg.MessageType}");
|
||||
}
|
||||
|
||||
if (handler != null)
|
||||
{
|
||||
handler.HandlerMsg(this, client, msg);
|
||||
return handler;
|
||||
}
|
||||
|
||||
HandleMsg(client, msg);
|
||||
return null;
|
||||
}
|
||||
|
||||
private void HandleMsg(Socket client, Message<JObject> msg)
|
||||
{
|
||||
if (msg.MessageType != MessageType.Heart)
|
||||
{
|
||||
_logger.LogDebug($"收到客户端指令:{msg.MessageType}");
|
||||
}
|
||||
|
||||
switch (msg.MessageType)
|
||||
{
|
||||
case MessageType.Heart:
|
||||
client.Send(new Message<string>() { MessageType = MessageType.Heart, Content = null });
|
||||
|
||||
// 递归调用
|
||||
ReceiveClient(client, null);
|
||||
break;
|
||||
case MessageType.C_SwapMsg:
|
||||
var SwapMsg = msg.Content.ToObject<SwapMsgModel>();
|
||||
NewRequest request;
|
||||
|
||||
if (!string.IsNullOrEmpty(SwapMsg.msgId) && newRequest.TryGetValue(SwapMsg.msgId, out request))
|
||||
{
|
||||
// Join
|
||||
Task.Run(() =>
|
||||
{
|
||||
(new SocketSwap(request.CustomerClient, client))
|
||||
.BeforeSwap(() => { if (request.Buffer != null) client.Send(request.Buffer); })
|
||||
.StartSwap();
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
// 未找到,关闭连接
|
||||
_logger.LogError($"未找到请求:{SwapMsg.msgId}");
|
||||
client.Send(new Message<LogMsg> { MessageType = MessageType.Log, Content = new LogMsg(LogMsgType.Debug, $"未找到请求:{SwapMsg.msgId}") });
|
||||
}
|
||||
|
||||
break;
|
||||
case MessageType.S_NewCustomer:
|
||||
default:
|
||||
throw new Exception($"参数异常, 不支持消息类型 {msg.MessageType}");
|
||||
}
|
||||
handler.HandlerMsg(this, client, msg);
|
||||
return handler;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -9,6 +9,7 @@ namespace FastTunnel.Core.Extensions
|
|||
public static class SocketExtension
|
||||
{
|
||||
public static void Send<T>(this Socket socket, Message<T> message)
|
||||
where T : TunnelMassage
|
||||
{
|
||||
socket.Send(Encoding.UTF8.GetBytes(message.ToJson() + "\n"));
|
||||
}
|
||||
|
|
|
@ -7,6 +7,12 @@
|
|||
<StartupObject />
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Compile Remove="Logger\**" />
|
||||
<EmbeddedResource Remove="Logger\**" />
|
||||
<None Remove="Logger\**" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Compile Remove="Core\SuiDaoServer.cs.BASE.cs" />
|
||||
<Compile Remove="Core\SuiDaoServer.cs.LOCAL.cs" />
|
||||
|
@ -26,8 +32,4 @@
|
|||
<PackageReference Include="NLog.Extensions.Logging" Version="1.6.1" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Folder Include="Logger\" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
|
18
FastTunnel.Core/Handlers/Client/ClientHeartHandler.cs
Normal file
18
FastTunnel.Core/Handlers/Client/ClientHeartHandler.cs
Normal file
|
@ -0,0 +1,18 @@
|
|||
using FastTunnel.Core.Config;
|
||||
using FastTunnel.Core.Core;
|
||||
using FastTunnel.Core.Models;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace FastTunnel.Core.Handlers.Client
|
||||
{
|
||||
public class ClientHeartHandler : IClientHandler
|
||||
{
|
||||
public void HandlerMsg(FastTunnelClient cleint, Message<JObject> Msg)
|
||||
{
|
||||
cleint.lastHeart = DateTime.Now;
|
||||
}
|
||||
}
|
||||
}
|
15
FastTunnel.Core/Handlers/Client/IClientHandler.cs
Normal file
15
FastTunnel.Core/Handlers/Client/IClientHandler.cs
Normal file
|
@ -0,0 +1,15 @@
|
|||
using FastTunnel.Core.Config;
|
||||
using FastTunnel.Core.Core;
|
||||
using FastTunnel.Core.Models;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace FastTunnel.Core.Handlers.Client
|
||||
{
|
||||
public interface IClientHandler
|
||||
{
|
||||
public void HandlerMsg(FastTunnelClient cleint, Message<JObject> Msg);
|
||||
}
|
||||
}
|
47
FastTunnel.Core/Handlers/Client/LogHandler.cs
Normal file
47
FastTunnel.Core/Handlers/Client/LogHandler.cs
Normal file
|
@ -0,0 +1,47 @@
|
|||
using FastTunnel.Core.Config;
|
||||
using FastTunnel.Core.Models;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using System;
|
||||
using FastTunnel.Core.Extensions;
|
||||
using FastTunnel.Core.Core;
|
||||
|
||||
namespace FastTunnel.Core.Handlers.Client
|
||||
{
|
||||
public class LogHandler : IClientHandler
|
||||
{
|
||||
ILogger<LogHandler> _logger;
|
||||
|
||||
public LogHandler(ILogger<LogHandler> logger)
|
||||
{
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public void HandlerMsg(FastTunnelClient cleint, Message<JObject> Msg)
|
||||
{
|
||||
try
|
||||
{
|
||||
var msg = Msg.Content.ToObject<LogMassage>();
|
||||
|
||||
switch (msg.MsgType)
|
||||
{
|
||||
case LogMsgType.Info:
|
||||
_logger.LogInformation("From Server:" + msg.Msg);
|
||||
break;
|
||||
case LogMsgType.Error:
|
||||
_logger.LogError("From Server:" + msg.Msg);
|
||||
break;
|
||||
case LogMsgType.Debug:
|
||||
_logger.LogDebug("From Server:" + msg.Msg);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
26
FastTunnel.Core/Handlers/Client/NewCustomerHandler.cs
Normal file
26
FastTunnel.Core/Handlers/Client/NewCustomerHandler.cs
Normal file
|
@ -0,0 +1,26 @@
|
|||
using FastTunnel.Core.Config;
|
||||
using FastTunnel.Core.Core;
|
||||
using FastTunnel.Core.Models;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace FastTunnel.Core.Handlers.Client
|
||||
{
|
||||
public class NewCustomerHandler : IClientHandler
|
||||
{
|
||||
public void HandlerMsg(FastTunnelClient cleint, Message<JObject> Msg)
|
||||
{
|
||||
var request = Msg.Content.ToObject<NewCustomerMassage>();
|
||||
var connecter = new Connecter(cleint._serverConfig.ServerAddr, cleint._serverConfig.ServerPort);
|
||||
connecter.Connect();
|
||||
connecter.Send(new Message<SwapMassage> { MessageType = MessageType.C_SwapMsg, Content = new SwapMassage(request.MsgId) });
|
||||
|
||||
var localConnecter = new Connecter(request.WebConfig.LocalIp, request.WebConfig.LocalPort);
|
||||
localConnecter.Connect();
|
||||
|
||||
new SocketSwap(connecter.Socket, localConnecter.Socket).StartSwap();
|
||||
}
|
||||
}
|
||||
}
|
26
FastTunnel.Core/Handlers/Client/NewSSHHandler.cs
Normal file
26
FastTunnel.Core/Handlers/Client/NewSSHHandler.cs
Normal file
|
@ -0,0 +1,26 @@
|
|||
using FastTunnel.Core.Config;
|
||||
using FastTunnel.Core.Core;
|
||||
using FastTunnel.Core.Models;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace FastTunnel.Core.Handlers.Client
|
||||
{
|
||||
public class NewSSHHandler : IClientHandler
|
||||
{
|
||||
public void HandlerMsg(FastTunnelClient cleint, Message<JObject> Msg)
|
||||
{
|
||||
var request_ssh = Msg.Content.ToObject<NewSSHRequest>();
|
||||
var connecter_ssh = new Connecter(cleint._serverConfig.ServerAddr, cleint._serverConfig.ServerPort);
|
||||
connecter_ssh.Connect();
|
||||
connecter_ssh.Send(new Message<SwapMassage> { MessageType = MessageType.C_SwapMsg, Content = new SwapMassage(request_ssh.MsgId) });
|
||||
|
||||
var localConnecter_ssh = new Connecter(request_ssh.SSHConfig.LocalIp, request_ssh.SSHConfig.LocalPort);
|
||||
localConnecter_ssh.Connect();
|
||||
|
||||
new SocketSwap(connecter_ssh.Socket, localConnecter_ssh.Socket).StartSwap();
|
||||
}
|
||||
}
|
||||
}
|
21
FastTunnel.Core/Handlers/Server/HeartHandler.cs
Normal file
21
FastTunnel.Core/Handlers/Server/HeartHandler.cs
Normal file
|
@ -0,0 +1,21 @@
|
|||
using FastTunnel.Core.Core;
|
||||
using FastTunnel.Core.Extensions;
|
||||
using FastTunnel.Core.Models;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Net.Sockets;
|
||||
using System.Text;
|
||||
|
||||
namespace FastTunnel.Core.Handlers.Server
|
||||
{
|
||||
public class HeartHandler : IServerHandler
|
||||
{
|
||||
public bool NeedRecive => true;
|
||||
|
||||
public void HandlerMsg(FastTunnelServer server, Socket client, Message<JObject> msg)
|
||||
{
|
||||
client.Send(new Message<HeartMassage>() { MessageType = MessageType.Heart, Content = null });
|
||||
}
|
||||
}
|
||||
}
|
|
@ -8,6 +8,6 @@ namespace FastTunnel.Core.Handlers
|
|||
{
|
||||
public interface IConfigHandler
|
||||
{
|
||||
LogInRequest GetConfig(object content);
|
||||
LogInMassage GetConfig(JObject content);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -10,6 +10,8 @@ namespace FastTunnel.Core.Handlers
|
|||
{
|
||||
public interface IServerHandler
|
||||
{
|
||||
Boolean NeedRecive { get; }
|
||||
|
||||
void HandlerMsg(FastTunnelServer server, Socket client, Message<JObject> msg);
|
||||
}
|
||||
}
|
|
@ -15,23 +15,24 @@ namespace FastTunnel.Core.Handlers
|
|||
{
|
||||
ILogger<LoginHandler> _logger;
|
||||
|
||||
public bool NeedRecive => true;
|
||||
|
||||
public LoginHandler(ILogger<LoginHandler> logger)
|
||||
{
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public LogInRequest GetConfig(JObject content)
|
||||
public LogInMassage GetConfig(JObject content)
|
||||
{
|
||||
return content.ToObject<LogInRequest>();
|
||||
return content.ToObject<LogInMassage>();
|
||||
}
|
||||
|
||||
public void HandlerMsg(FastTunnelServer server, Socket client, Message<JObject> msg)
|
||||
{
|
||||
HandleLogin(server, client, GetConfig(msg.Content));
|
||||
server.ReceiveClient(client, null);
|
||||
}
|
||||
|
||||
public void HandleLogin(FastTunnelServer server, Socket client, LogInRequest requet)
|
||||
public void HandleLogin(FastTunnelServer server, Socket client, LogInMassage requet)
|
||||
{
|
||||
if (requet.Webs != null && requet.Webs.Count() > 0)
|
||||
{
|
||||
|
@ -51,10 +52,10 @@ namespace FastTunnel.Core.Handlers
|
|||
server.WebList.Add(hostName, new WebInfo { Socket = client, WebConfig = item });
|
||||
}
|
||||
|
||||
client.Send(new Message<LogMsg> { MessageType = MessageType.Log, Content = new LogMsg(LogMsgType.Info, $"TunnelForWeb is OK: you can visit {item.LocalIp}:{item.LocalPort} from http://{hostName}:{server._serverSettings.ProxyPort_HTTP}") });
|
||||
client.Send(new Message<LogMassage> { MessageType = MessageType.Log, Content = new LogMassage(LogMsgType.Info, $"TunnelForWeb is OK: you can visit {item.LocalIp}:{item.LocalPort} from http://{hostName}:{server._serverSettings.ProxyPort_HTTP}") });
|
||||
}
|
||||
|
||||
client.Send(new Message<LogMsg> { MessageType = MessageType.Log, Content = new LogMsg(LogMsgType.Info, "web隧道已建立完毕") });
|
||||
client.Send(new Message<LogMassage> { MessageType = MessageType.Log, Content = new LogMassage(LogMsgType.Info, "web隧道已建立完毕") });
|
||||
}
|
||||
|
||||
if (requet.SSH != null && requet.SSH.Count() > 0)
|
||||
|
@ -102,18 +103,18 @@ namespace FastTunnel.Core.Handlers
|
|||
server.SSHList.Add(item.RemotePort, new SSHInfo<SSHHandlerArg> { Listener = ls, Socket = client, SSHConfig = item });
|
||||
_logger.LogDebug($"SSH proxy success: {item.RemotePort} -> {item.LocalIp}:{item.LocalPort}");
|
||||
|
||||
client.Send(new Message<LogMsg> { MessageType = MessageType.Log, Content = new LogMsg(LogMsgType.Info, $"TunnelForSSH is OK: [ServerAddr]:{item.RemotePort}->{item.LocalIp}:{item.LocalPort}") });
|
||||
client.Send(new Message<LogMassage> { MessageType = MessageType.Log, Content = new LogMassage(LogMsgType.Info, $"TunnelForSSH is OK: [ServerAddr]:{item.RemotePort}->{item.LocalIp}:{item.LocalPort}") });
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError($"SSH proxy error: {item.RemotePort} -> {item.LocalIp}:{item.LocalPort}");
|
||||
_logger.LogError(ex.Message);
|
||||
client.Send(new Message<LogMsg> { MessageType = MessageType.Log, Content = new LogMsg(LogMsgType.Info, ex.Message) });
|
||||
client.Send(new Message<LogMassage> { MessageType = MessageType.Log, Content = new LogMassage(LogMsgType.Info, ex.Message) });
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
client.Send(new Message<LogMsg> { MessageType = MessageType.Log, Content = new LogMsg(LogMsgType.Info, "远程桌面隧道已建立完毕") });
|
||||
client.Send(new Message<LogMassage> { MessageType = MessageType.Log, Content = new LogMassage(LogMsgType.Info, "远程桌面隧道已建立完毕") });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
48
FastTunnel.Core/Handlers/Server/SwapMsgHandler.cs
Normal file
48
FastTunnel.Core/Handlers/Server/SwapMsgHandler.cs
Normal file
|
@ -0,0 +1,48 @@
|
|||
using FastTunnel.Core.Core;
|
||||
using FastTunnel.Core.Extensions;
|
||||
using FastTunnel.Core.Models;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Net.Sockets;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace FastTunnel.Core.Handlers.Server
|
||||
{
|
||||
public class SwapMsgHandler : IServerHandler
|
||||
{
|
||||
public bool NeedRecive => false;
|
||||
|
||||
ILogger<LoginHandler> _logger;
|
||||
|
||||
public SwapMsgHandler(ILogger<LoginHandler> logger)
|
||||
{
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public void HandlerMsg(FastTunnelServer server, Socket client, Message<JObject> msg)
|
||||
{
|
||||
var SwapMsg = msg.Content.ToObject<SwapMassage>();
|
||||
NewRequest request;
|
||||
|
||||
if (!string.IsNullOrEmpty(SwapMsg.msgId) && server.newRequest.TryGetValue(SwapMsg.msgId, out request))
|
||||
{
|
||||
// Join
|
||||
Task.Run(() =>
|
||||
{
|
||||
(new SocketSwap(request.CustomerClient, client))
|
||||
.BeforeSwap(() => { if (request.Buffer != null) client.Send(request.Buffer); })
|
||||
.StartSwap();
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
// 未找到,关闭连接
|
||||
_logger.LogError($"未找到请求:{SwapMsg.msgId}");
|
||||
client.Send(new Message<LogMassage> { MessageType = MessageType.Log, Content = new LogMassage(LogMsgType.Debug, $"未找到请求:{SwapMsg.msgId}") });
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -4,8 +4,7 @@ using System.Text;
|
|||
|
||||
namespace FastTunnel.Core.Models
|
||||
{
|
||||
public class LogInByKeyRequest
|
||||
public class HeartMassage : TunnelMassage
|
||||
{
|
||||
public string key { get; set; }
|
||||
}
|
||||
}
|
|
@ -5,7 +5,7 @@ using System.Text;
|
|||
|
||||
namespace FastTunnel.Core.Models
|
||||
{
|
||||
public class LogInRequest
|
||||
public class LogInMassage : TunnelMassage
|
||||
{
|
||||
public IEnumerable<WebConfig> Webs { get; set; }
|
||||
|
|
@ -4,13 +4,13 @@ using System.Text;
|
|||
|
||||
namespace FastTunnel.Core.Models
|
||||
{
|
||||
public class LogMsg
|
||||
public class LogMassage : TunnelMassage
|
||||
{
|
||||
public string Msg { get; set; }
|
||||
|
||||
public LogMsgType MsgType { get; set; }
|
||||
|
||||
public LogMsg(LogMsgType msgType, string msg)
|
||||
public LogMassage(LogMsgType msgType, string msg)
|
||||
{
|
||||
this.Msg = msg;
|
||||
MsgType = msgType;
|
|
@ -4,7 +4,7 @@ using System.Text;
|
|||
|
||||
namespace FastTunnel.Core.Models
|
||||
{
|
||||
public class NewCustomerRequest
|
||||
public class NewCustomerMassage : TunnelMassage
|
||||
{
|
||||
public string MsgId { get; set; }
|
||||
|
|
@ -4,11 +4,11 @@ using System.Text;
|
|||
|
||||
namespace FastTunnel.Core.Models
|
||||
{
|
||||
public class SwapMsgModel
|
||||
public class SwapMassage : TunnelMassage
|
||||
{
|
||||
public string msgId { get; set; }
|
||||
|
||||
public SwapMsgModel(string msgId)
|
||||
public SwapMassage(string msgId)
|
||||
{
|
||||
this.msgId = msgId;
|
||||
}
|
10
FastTunnel.Core/Models/Massage/TunnelMassage.cs
Normal file
10
FastTunnel.Core/Models/Massage/TunnelMassage.cs
Normal file
|
@ -0,0 +1,10 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace FastTunnel.Core.Models
|
||||
{
|
||||
public class TunnelMassage
|
||||
{
|
||||
}
|
||||
}
|
|
@ -4,7 +4,7 @@ using System.Text;
|
|||
|
||||
namespace FastTunnel.Core.Models
|
||||
{
|
||||
public class NewSSHRequest
|
||||
public class NewSSHRequest : TunnelMassage
|
||||
{
|
||||
public string MsgId { get; set; }
|
||||
|
||||
|
|
|
@ -17,6 +17,7 @@ using FastTunnel.Core.Config;
|
|||
using FastTunnel.Core.Host;
|
||||
using FastTunnel.Core.Core;
|
||||
using FastTunnel.Core.Handlers;
|
||||
using FastTunnel.Core.Handlers.Server;
|
||||
|
||||
namespace FastTunnel.Server
|
||||
{
|
||||
|
@ -65,8 +66,10 @@ namespace FastTunnel.Server
|
|||
|
||||
private static void Config(ServiceCollection service)
|
||||
{
|
||||
service.AddTransient<FastTunnelServer>()
|
||||
service.AddSingleton<FastTunnelServer>()
|
||||
.AddSingleton<LoginHandler>()
|
||||
.AddSingleton<HeartHandler>()
|
||||
.AddSingleton<SwapMsgHandler>()
|
||||
.AddSingleton<ServerConfig>(implementationFactory);
|
||||
}
|
||||
|
||||
|
|
12
SuiDao.Client/Models/LogInByKeyMassage.cs
Normal file
12
SuiDao.Client/Models/LogInByKeyMassage.cs
Normal file
|
@ -0,0 +1,12 @@
|
|||
using FastTunnel.Core.Models;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace SuiDao.Client.Models
|
||||
{
|
||||
public class LogInByKeyMassage : TunnelMassage
|
||||
{
|
||||
public string key { get; set; }
|
||||
}
|
||||
}
|
|
@ -1,6 +1,7 @@
|
|||
using FastTunnel.Core;
|
||||
using FastTunnel.Core.Config;
|
||||
using FastTunnel.Core.Core;
|
||||
using FastTunnel.Core.Handlers.Client;
|
||||
using FastTunnel.Core.Host;
|
||||
using FastTunnel.Core.Models;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
|
@ -53,7 +54,7 @@ namespace SuiDao.Client
|
|||
Console.WriteLine($"0:其他密钥登录");
|
||||
for (int i = 0; i < keys.Count; i++)
|
||||
{
|
||||
Console.WriteLine($"{i + 1}:{keys[i]}");
|
||||
Console.WriteLine($" {i + 1}:{keys[i]}");
|
||||
}
|
||||
|
||||
Console.WriteLine(Environment.NewLine + "输入编号回车键继续:");
|
||||
|
@ -181,7 +182,7 @@ namespace SuiDao.Client
|
|||
}
|
||||
|
||||
// 登录
|
||||
_client.Send(new Message<LogInByKeyRequest> { MessageType = MessageType.C_LogIn, Content = new LogInByKeyRequest { key = key } });
|
||||
_client.Send(new Message<LogInByKeyMassage> { MessageType = MessageType.C_LogIn, Content = new LogInByKeyMassage { key = key } });
|
||||
|
||||
return _client;
|
||||
}, new SuiDaoServer { ServerAddr = server.ip, ServerPort = server.bind_port });
|
||||
|
@ -195,7 +196,11 @@ namespace SuiDao.Client
|
|||
|
||||
private static void Config(ServiceCollection service)
|
||||
{
|
||||
service.AddTransient<FastTunnelClient>();
|
||||
service.AddSingleton<FastTunnelClient>()
|
||||
.AddSingleton<ClientHeartHandler>()
|
||||
.AddSingleton<LogHandler>()
|
||||
.AddSingleton<NewCustomerHandler>()
|
||||
.AddSingleton<NewSSHHandler>();
|
||||
}
|
||||
|
||||
public static void AppendTextToFile(string filename, string inputStr)
|
||||
|
|
|
@ -4,6 +4,7 @@ using FastTunnel.Core.Handlers;
|
|||
using FastTunnel.Core.Models;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using SuiDao.Client;
|
||||
using SuiDao.Client.Models;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Net.Sockets;
|
||||
|
@ -12,9 +13,9 @@ namespace SuiDao.Server
|
|||
{
|
||||
public class SuiDaoLoginHandler : IConfigHandler
|
||||
{
|
||||
public LogInRequest GetConfig(object content)
|
||||
public LogInMassage GetConfig(JObject content)
|
||||
{
|
||||
var key = (content as JObject)["key"].ToString();
|
||||
var key = content.ToObject<LogInByKeyMassage>().key;
|
||||
var res = HttpHelper.PostAsJson("https://api1.suidao.io/api/Client/GetTunnelByKey", $"{{ \"key\":\"{key}\"}}").Result;
|
||||
var jobj = JObject.Parse(res);
|
||||
if ((bool)jobj["success"] == true)
|
||||
|
@ -46,7 +47,7 @@ namespace SuiDao.Server
|
|||
}
|
||||
}
|
||||
|
||||
return new LogInRequest
|
||||
return new LogInMassage
|
||||
{
|
||||
SSH = SSH,
|
||||
Webs = Webs,
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
using FastTunnel.Core.Config;
|
||||
using FastTunnel.Core.Core;
|
||||
using FastTunnel.Core.Handlers;
|
||||
using FastTunnel.Core.Handlers.Server;
|
||||
using FastTunnel.Core.Host;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
|
@ -56,10 +57,12 @@ namespace SuiDao.Server
|
|||
|
||||
private static void Config(ServiceCollection service)
|
||||
{
|
||||
service.AddTransient<FastTunnelServer>()
|
||||
service.AddSingleton<FastTunnelServer>()
|
||||
.AddSingleton<ServerConfig>(implementationFactory)
|
||||
.AddSingleton<LoginHandler>()
|
||||
.AddTransient<IConfigHandler, SuiDaoLoginHandler>();
|
||||
.AddSingleton<LoginHandler>()
|
||||
.AddSingleton<SwapMsgHandler>()
|
||||
.AddSingleton<HeartHandler>()
|
||||
.AddSingleton<IConfigHandler, SuiDaoLoginHandler>();
|
||||
}
|
||||
|
||||
private static void Run(IServiceProvider servicesProvider)
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
|
||||
<ItemGroup>
|
||||
<Compile Include="..\SuiDao.Client\HttpHelper.cs" Link="HttpHelper.cs" />
|
||||
<Compile Include="..\SuiDao.Client\Models\LogInByKeyMassage.cs" Link="Model\LogInByKeyMassage.cs" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
|
Loading…
Reference in New Issue
Block a user