using HighWayIot.Log4net;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using TouchSocket.Core;
using TouchSocket.Sockets;
namespace HighWayIot.TouchSocket
{
///
/// 用于格口盘点
///
public class TcpClientServer
{
private static readonly Lazy lazy = new Lazy(() => new TcpClientServer());
public static TcpClientServer Instance => lazy.Value;
private static LogHelper logHelper = LogHelper.Instance;
TcpClient tcpClient = new TcpClient();
///
/// 字符串数组转换为int数组
///
public Action GetBinCode;
public Action GetString;
///
/// 客户端状态获取
///
public bool ClientState
{
get => tcpClient.Online;
}
///
/// 客户端连接
///
///
public async Task ClientConnect(string ip, string port)
{
try
{
if (!string.IsNullOrEmpty(tcpClient.IP))
{
tcpClient.Connect();
tcpClient.Logger.Info("客户端成功连接");
return true;
}
tcpClient.Connecting = (client, e) =>
{
return EasyTask.CompletedTask;
};//即将连接到服务器,此时已经创建socket,但是还未建立tcp
tcpClient.Connected = (client, e) =>
{
return EasyTask.CompletedTask;
};//成功连接到服务器
tcpClient.Closing = (client, e) =>
{
return EasyTask.CompletedTask;
};//即将从服务器断开连接。此处仅主动断开才有效。
tcpClient.Closed = (client, e) =>
{
return EasyTask.CompletedTask;
};//从服务器断开连接,当连接不成功时不会触发。
tcpClient.Received = async (client, e) =>
{
//从服务器收到信息。但是一般byteBlock和requestInfo会根据适配器呈现不同的值。
var mes = e.ByteBlock.Span.ToString(Encoding.UTF8);
logHelper.Info($"客户端接收到信息:{mes}");
if (await MessageAnalyzer(mes))
{
logHelper.Info("数据解析成功");
}
else
{
logHelper.Error("数据解析失败或者getinfo信号发送失败");
}
};
//载入配置
await tcpClient.SetupAsync(new TouchSocketConfig()
.SetRemoteIPHost($"{ip}:{port}")
.ConfigurePlugins(a =>
{
a.UseTcpReconnection()//添加TcpClientPlugin插件
.UsePolling(TimeSpan.FromSeconds(1));
})
.ConfigureContainer(a =>
{
a.AddConsoleLogger();//添加一个日志注入
}));
tcpClient.Connect();//调用连接,当连接不成功时,会抛出异常。
tcpClient.Logger.Info("客户端成功连接");
return true;
}
catch (Exception ex)
{
tcpClient.Logger.Info("客户端连接失败" + ex);
return false;
}
}
///
/// 接收数据分析
///
///
///
public async Task MessageAnalyzer(string mes)
{
try
{
if (mes.Contains("OK"))
{
await Send("getinfo");
}
else
{
//string[] binNoList = ClientStringAnalysis.GetInfoAnalyzer(mes);
GetString.Invoke(mes);
}
return true;
}
catch (ClientNotConnectedException ex)
{
logHelper.Error("发送数据发生错误" + ex);
return false;
}
catch (OverlengthException ex)
{
logHelper.Error("发送数据发生错误" + ex);
return false;
}
catch(Exception ex)
{
logHelper.Error("数据解析类发生错误" + ex);
return false;
}
}
///
/// 信息发送
///
///
///
public async Task Send(string message)
{
try
{
await tcpClient.SendAsync(message);
return true;
}
catch (Exception e)
{
logHelper.Error("发送数据发生错误" + e);
return false;
}
}
///
/// 客户端关闭
///
///
public async Task ClientClose()
{
try
{
await tcpClient.CloseAsync();
return true;
}
catch(Exception e)
{
logHelper.Error("关闭客户端发生错误" + e);
return false;
}
}
}
}