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的封装,可自行实现。