You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

114 lines
3.4 KiB
C#

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<TcpClientServer> lazy = new Lazy<TcpClientServer>(() => new TcpClientServer());
public static TcpClientServer Instance => lazy.Value;
private static LogHelper logHelper = LogHelper.Instance;
TcpClient tcpClient = new TcpClient();
public bool ClientState
{
get => tcpClient.Online;
}
/// <summary>
/// 客户端连接
/// </summary>
/// <returns></returns>
public async Task<bool> ClientConnect(string ip, string port)
{
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 = (client, e) =>
{
//从服务器收到信息。但是一般byteBlock和requestInfo会根据适配器呈现不同的值。
var mes = e.ByteBlock.Span.ToString(Encoding.UTF8);
tcpClient.Logger.Info($"客户端接收到信息:{mes}");
return EasyTask.CompletedTask;
};
//载入配置
await tcpClient.SetupAsync(new TouchSocketConfig()
.SetRemoteIPHost($"{ip}:{port}")
.ConfigureContainer(a =>
{
a.AddConsoleLogger();//添加一个日志注入
}));
await tcpClient.ConnectAsync();//调用连接,当连接不成功时,会抛出异常。
Result result = await tcpClient.TryConnectAsync();//或者可以调用TryConnectAsync
if (result.IsSuccess())
{
tcpClient.Logger.Info("客户端成功连接");
}
else
{
tcpClient.Logger.Info("客户端连接失败");
}
return result.IsSuccess();
}
public bool SendMessage(string message)
{
try
{
tcpClient.SendAsync(message);
return true;
}
catch (Exception e)
{
logHelper.Error("发送数据发生错误" + e);
return false;
}
}
public bool ClientClose()
{
try
{
tcpClient.CloseAsync();
return true;
}
catch(Exception e)
{
logHelper.Error("关闭客户端发生错误" + e);
return false;
}
}
}
}