Socket TCP
Demo
private readonly TcpHelper _tcpHelper;
public ctor()
{
_tcpHelper = new TcpHelper();
_tcpHelper.DataReceivedEvent += TcpClient_DataReceivedEvent;
if (_tcpHelper.TcpInit("192.16.1.23", "6000"))
{
_tcpHelper.SetStartIdentifier(null);
_tcpHelper.SetEndIdentifier(Encoding.UTF8.GetBytes("*"));
var cmd = WSCommFunc.SerializeWithCamel(request);
_tcpHelper.TcpSend(cmd);
}
}
public void TcpClient_DataReceivedEvent(object sender, EventArgs e)
{
if (e is CommTcpEventArgs args)
{
switch (args.State)
{
case CommTcpStateType.Open:
{
ShowLogInfo("tcp已连接上.");
}
break;
case CommTcpStateType.Error:
{
ShowLogInfo("tcp发生错误! 信息:" + args.Message);
}
break;
case CommTcpStateType.Close:
{
ShowLogInfo("tcp已关闭.");
}
break;
case CommTcpStateType.Connect:
var message = Encoding.UTF8.GetString(args.Message);
ShowLogInfo(message);
break;
default:
break;
}
}
}
TcpHelper
///
/// Tcp通信帮助类(有帧头、帧尾检测)
///
internal sealed class TcpHelper
{
private readonly WeakEvent _dataReceivedEvent = new WeakEvent();
///
/// 返回的消息数据弱事件
///
public event EventHandler DataReceivedEvent
{
add => _dataReceivedEvent.Add(value, value.Invoke);
remove => _dataReceivedEvent.Remove(value);
}
public bool IsOpen => _client != null && _client.IsOpen;
private readonly CustomTcp _client;
public TcpHelper()
{
_client = new CustomTcp();
}
///
/// 设置结尾标识符
///
///
public void SetEndIdentifier(byte[] end)
{
if (_client != null)
{
_client.EndIdentifier = end;
}
}
///
/// 设置开始标识符
///
///
public void SetStartIdentifier(byte[] start)
{
if (_client != null)
{
_client.StartIdentifier = start;
}
}
///
/// Tcp初始化
///
///
///
public bool TcpInit(string ip, string port)
{
_client.DataReceivedEvent -= TcpClient_DataReceivedEvent;
_client.DataReceivedEvent += TcpClient_DataReceivedEvent;
return _client.Open(ip, port);
}
///
/// 关闭连接
///
public void TcpClose()
{
if (_client != null)
{
_client.DataReceivedEvent -= TcpClient_DataReceivedEvent;
_client.Close();
}
}
///
/// 发送命令
///
/// 命令内容
public void TcpSend(string cmd)
{
if (_client != null)
{
try
{
_client.Send(cmd);
}
catch (Exception ex)
{
LogFactory.GetInstance().Error("tcp发送信息发生异常:", ex);
}
}
}
///
/// 发送命令
///
/// 命令内容
public void TcpSend(byte[] data)
{
if (_client != null)
{
try
{
_client.Send(data);
}
catch (Exception ex)
{
LogFactory.GetInstance().Error("tcp发送信息发生异常:", ex);
}
}
}
///
/// 发送命令(带数据累积和校验)
///
///
/// 功能码
public void TcpSendSumCheck(byte[] data, ControllerIdentifiers identifier)
{
// 通信命令格式: 起始符(88) + 功能码 + 数据长度(mod 255) + 数据内容(DATA) + 数据校验
int len = data.Length % 255;
byte sum = WSCommFunc.GetSum(data);
List tmp = new List(data.Length + 3) { (byte)identifier, (byte)len };
tmp.AddRange(data);
tmp.Add(sum);
if (IsOpen)
{
_client.Send(tmp.ToArray());
}
}
///
/// 获取的数据校验
///
///
/// true校验成功
public bool DataSumCheck(byte[] data)
{
// 数据格式: 功能码 + 数据长度(mod 255) + 数据内容(DATA) + 数据校验
int length = data.Length;
if (length <= 3)
{
return false;
}
// 长度不一致,异常数据
if (data[1] != length - 3)
{
return false;
}
byte[] temp = new byte[length - 3];
Array.Copy(data, 2, temp, 0, length - 3);
byte sum = WSCommFunc.GetSum(temp);
return sum == data[length - 1];
}
private void TcpClient_DataReceivedEvent(object sender, EventArgs e)
{
_ = _dataReceivedEvent.Invoke(this, e);
}
}
///
/// 控制器的功能码
///
internal enum ControllerIdentifiers
{
///
/// -, 返回0xA0
///
[VersionData("A0")]
心跳包 = 0xA0,
///
/// 0xBB, 返回0xAB
///
[VersionData("AB")]
设置本地网络参数 = 0xBB,
///
/// 0xBC, 返回0xAC
///
[VersionData("AC")]
读取本地网络参数 = 0xBC,
}
其中,是基于SuperSocket.ClientEngine的封装,可自行实现。