修复解析指令时的已知bug

This commit is contained in:
SpringHgui 2020-08-02 00:35:19 +08:00
parent f0b0534902
commit f7f20cc206
3 changed files with 64 additions and 58 deletions

View File

@ -30,7 +30,7 @@ namespace FastTunnel.Client
{
var servicesProvider = new Host().Config(Config).Build();
Run(servicesProvider);
RunAsync(servicesProvider);
while (true)
{
@ -50,40 +50,40 @@ namespace FastTunnel.Client
}
}
private static void Run(IServiceProvider servicesProvider)
private static async Task RunAsync(IServiceProvider servicesProvider)
{
var client = servicesProvider.GetRequiredService<FastTunnelClient>();
var config = servicesProvider.GetRequiredService<ClientConfig>();
client.Login(() =>
await client.LoginAsync(Task.Run(() =>
{
Connecter _client;
Connecter _client;
try
{
// 连接到的目标IP
_client = new Connecter(config.Common.ServerAddr, config.Common.ServerPort);
_client.Connect();
}
catch (Exception ex)
{
Thread.Sleep(5000);
throw;
}
try
{
// 连接到的目标IP
_client = new Connecter(config.Common.ServerAddr, config.Common.ServerPort);
_client.Connect();
}
catch (Exception ex)
{
Thread.Sleep(5000);
throw;
}
// 登录
_client.Send(new Message<LogInMassage>
{
MessageType = MessageType.C_LogIn,
Content = new LogInMassage
{
Webs = config.Webs,
SSH = config.SSH
}
});
// 登录
_client.Send(new Message<LogInMassage>
{
MessageType = MessageType.C_LogIn,
Content = new LogInMassage
{
Webs = config.Webs,
SSH = config.SSH
}
});
return _client;
}, config.Common);
return _client;
}), config.Common);
while (true)
{

View File

@ -27,7 +27,7 @@ namespace FastTunnel.Core.Core
System.Timers.Timer timer_timeout;
System.Timers.Timer timer_heart;
Func<Connecter> login;
Task<Connecter> login;
double heartInterval = 10 * 1000; // 10 秒心跳
public DateTime lastHeart;
Thread th;
@ -74,7 +74,7 @@ namespace FastTunnel.Core.Core
_logger.LogDebug($"last heart recived {span / 1000}s ago");
// 重新登录
reConnect();
reConnectAsync();
}
}
catch (Exception ex)
@ -87,19 +87,19 @@ namespace FastTunnel.Core.Core
}
}
private void reConnect()
private async Task reConnectAsync()
{
Close();
try
{
_client = login.Invoke();
_client = await login;
}
catch (Exception ex)
{
_logger.LogError(ex.Message);
Thread.Sleep(reTrySpan);
reConnect();
reConnectAsync();
return;
}
@ -124,25 +124,25 @@ namespace FastTunnel.Core.Core
}
}
public void Login(Func<Connecter> fun, SuiDaoServer serverConfig)
public async Task LoginAsync(Task<Connecter> fun, SuiDaoServer serverConfig)
{
_serverConfig = serverConfig;
login = fun;
try
{
_client = login.Invoke();
_client = await login;
}
catch (Exception ex)
{
_logger.LogError(ex.Message);
Thread.Sleep(reTrySpan);
reConnect();
reConnectAsync();
return;
}
LogSuccess(_client.Socket);
//LogSuccess(_client.Socket);
}
void Close()

View File

@ -199,6 +199,7 @@ namespace FastTunnel.Core.Core
}
byte[] buffer = new byte[1024 * 1024];
string temp = string.Empty;
public void ReceiveClient(Socket client, object _)
{
@ -235,14 +236,38 @@ namespace FastTunnel.Core.Core
// 将字节转换成字符串
string words = Encoding.UTF8.GetString(buffer, 0, length);
words += temp;
temp = string.Empty;
try
{
if (HandleWords(words, client).NeedRecive)
int index = 0;
bool needRecive = false;
while (true)
{
var firstIndex = words.IndexOf("\n");
if (firstIndex < 0)
{
temp += words;
ReceiveClient(client, _);
break;
}
var sub_words = words.Substring(index, firstIndex + 1);
var res = handle(sub_words, client);
if (res.NeedRecive)
needRecive = true;
words = words.Replace(sub_words, string.Empty);
if (string.IsNullOrEmpty(words))
break;
}
if (needRecive)
{
// 递归
ReceiveClient(client, _);
return;
}
}
catch (Exception ex)
@ -255,25 +280,6 @@ namespace FastTunnel.Core.Core
}
}
private IServerHandler HandleWords(string words, Socket client)
{
// 同时读到两个或多个指令
var index = words.IndexOf("\n");
if (index > 0)
{
_logger.LogError($"读到多个消息 {words}");
var sub_words = words.Substring(0, index + 1);
var left = words.Substring(index + 1);
handle(sub_words, client);
return HandleWords(left, client);
}
else
{
return handle(words, client);
}
}
private IServerHandler handle(string words, Socket client)
{
Message<JObject> msg = JsonConvert.DeserializeObject<Message<JObject>>(words);