抽象处理接口,统一消息发送

This commit is contained in:
SpringHgui 2020-04-08 18:37:37 +08:00
parent f899be5dc2
commit e83ccc4ac2
29 changed files with 377 additions and 193 deletions

View File

@ -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);
}

View File

@ -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);
}
}
}

View File

@ -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;
}
}
}

View File

@ -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;
}
}
}

View File

@ -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"));
}

View File

@ -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>

View 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;
}
}
}

View 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);
}
}

View 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);
}
}
}
}

View 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();
}
}
}

View 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();
}
}
}

View 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 });
}
}
}

View File

@ -8,6 +8,6 @@ namespace FastTunnel.Core.Handlers
{
public interface IConfigHandler
{
LogInRequest GetConfig(object content);
LogInMassage GetConfig(JObject content);
}
}

View File

@ -10,6 +10,8 @@ namespace FastTunnel.Core.Handlers
{
public interface IServerHandler
{
Boolean NeedRecive { get; }
void HandlerMsg(FastTunnelServer server, Socket client, Message<JObject> msg);
}
}

View File

@ -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, "远程桌面隧道已建立完毕") });
}
}
}

View 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}") });
}
}
}
}

View File

@ -4,8 +4,7 @@ using System.Text;
namespace FastTunnel.Core.Models
{
public class LogInByKeyRequest
public class HeartMassage : TunnelMassage
{
public string key { get; set; }
}
}

View File

@ -5,7 +5,7 @@ using System.Text;
namespace FastTunnel.Core.Models
{
public class LogInRequest
public class LogInMassage : TunnelMassage
{
public IEnumerable<WebConfig> Webs { get; set; }

View File

@ -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;

View File

@ -4,7 +4,7 @@ using System.Text;
namespace FastTunnel.Core.Models
{
public class NewCustomerRequest
public class NewCustomerMassage : TunnelMassage
{
public string MsgId { get; set; }

View File

@ -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;
}

View File

@ -0,0 +1,10 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace FastTunnel.Core.Models
{
public class TunnelMassage
{
}
}

View File

@ -4,7 +4,7 @@ using System.Text;
namespace FastTunnel.Core.Models
{
public class NewSSHRequest
public class NewSSHRequest : TunnelMassage
{
public string MsgId { get; set; }

View File

@ -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);
}

View 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; }
}
}

View File

@ -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)

View File

@ -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,

View File

@ -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)

View File

@ -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>