最近有一个项目用到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)
{
}
}
}