SuperSimpleTcp开源库

最近有一个项目用到c#与智能相机走Socket通讯的项目,发下了一个开源的socket库:SuperSimpleTcp ,废话不多说,直接上代码。


using System;

using System.Text;

using System.Windows.Forms;

using SuperSimpleTcp;

namespace SuperSimpleTcpDemo

{

复制代码
public partial class Form1 : Form
{
    private SimpleTcpClient _client;

    // 用于按 '\n' 做分包(解决粘包/半包)
    private readonly StringBuilder _recvBuffer = new StringBuilder();
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        // 默认值(也可以在设计器里设置)
        if (string.IsNullOrWhiteSpace(txtIp.Text)) txtIp.Text = "127.0.0.1";
        if (numPort.Value == 0) numPort.Value = 4040;

        btnDisconnect.Enabled = false;
        btnSend.Enabled = false;

        // 回车发送
        txtSend.KeyDown += (_, ke) =>
        {
            if (ke.KeyCode == Keys.Enter)
            {
                ke.SuppressKeyPress = true;
                SendCurrentText();
            }
        };

        btnConnect.Click += (_, __) => Connect();
        btnDisconnect.Click += (_, __) => Disconnect();
        btnSend.Click += (_, __) => SendCurrentText();

        AppendLog("程序已启动。请点击【连接】。");
    }

    private void EnsureClientCreated()
    {
        if (_client != null) return;

        string serverIp = txtIp.Text.Trim();
        int serverPort = (int)numPort.Value;

        _client = new SimpleTcpClient($"{serverIp}:{serverPort}");

        // 连接成功
        _client.Events.Connected += (_, __) =>
        {
            SafeUi(() =>
            {
                AppendLog($"[CONNECTED] {serverIp}:{serverPort}");
                btnConnect.Enabled = false;
                btnDisconnect.Enabled = true;
                btnSend.Enabled = true;
            });
        };

        // 断开连接
        _client.Events.Disconnected += (_, __) =>
        {
            SafeUi(() =>
            {
                AppendLog($"[DISCONNECTED] {serverIp}:{serverPort}");
                btnConnect.Enabled = true;
                btnDisconnect.Enabled = false;
                btnSend.Enabled = false;
            });
        };

        // 收到数据(注意:这是"字节流",可能粘包/半包)
        _client.Events.DataReceived += (_, data) =>
        {
            string chunk = Encoding.UTF8.GetString(data.Data);

            lock (_recvBuffer)
            {
                _recvBuffer.Append(chunk);

                while (true)
                {
                    string all = _recvBuffer.ToString();
                    int idx = all.IndexOf('\n');
                    if (idx < 0) break;

                    string one = all.Substring(0, idx).TrimEnd('\r');
                    _recvBuffer.Clear();
                    _recvBuffer.Append(all.Substring(idx + 1));

                    SafeUi(() => AppendLog("[RECV] " + one));
                }
            }
        };

        // 可选:错误事件(不同版本库可能名字不一样;若你项目里没有该事件可删掉)
        // _client.Events.Error += (_, err) => SafeUi(() => AppendLog("[ERROR] " + err.Exception?.Message));
    }

    private void Connect()
    {
        try
        {
            EnsureClientCreated();

            if (_client == null) return;

            if (_client.IsConnected)
            {
                AppendLog("已连接,无需重复连接。");
                return;
            }

            AppendLog("正在连接...");
            _client.Connect();
        }
        catch (Exception ex)
        {
            AppendLog("[CONNECT ERROR] " + ex.Message);
        }
    }

    private void Disconnect()
    {
        try
        {
            if (_client == null) return;

            AppendLog("正在断开...");
            _client.Disconnect();
        }
        catch (Exception ex)
        {
            AppendLog("[DISCONNECT ERROR] " + ex.Message);
        }
    }

    private void SendCurrentText()
    {
        try
        {
            if (_client == null || !_client.IsConnected)
            {
                AppendLog("未连接,无法发送。");
                return;
            }

            var text = txtSend.Text;
            if (string.IsNullOrWhiteSpace(text))
                return;

            // 行协议:每条消息以 \n 结束
            var msg = text + "\n";

            _client.Send(msg);
            AppendLog("[SENT] " + text);

            txtSend.Clear();
            txtSend.Focus();
        }
        catch (Exception ex)
        {
            AppendLog("[SEND ERROR] " + ex.Message);
        }
    }

    private void AppendLog(string line)
    {
        // 给日志加时间戳
        txtLog.AppendText($"{DateTime.Now:HH:mm:ss} {line}\r\n");
    }

    private void SafeUi(Action action)
    {
        if (IsDisposed) return;

        if (InvokeRequired)
            BeginInvoke(action);
        else
            action();
    }

    protected override void OnFormClosing(FormClosingEventArgs e)
    {
        try
        {
            _client?.Disconnect();
        }
        catch { /* ignore */ }

        base.OnFormClosing(e);
    }

    private void btnConnect_Click(object sender, EventArgs e)
    {

    }

    private void btnSend_Click(object sender, EventArgs e)
    {

    }

    private void button1_Click(object sender, EventArgs e)
    {
        
    }

    
}

}