Socket通信C#项目,完整的服务端和客户端,让您绕过最难写的Socket管理,是困难的多线程处理变成简单的事件处理,非常容易上手。 功能带有断线重连,实时侦测设备状态,简单实用,适合初学者或有迫切要完成项目需求使用。 带开发文档和示例! 这是一套经过实践的项目,非常适合于网络扫码器的采集数据,如果你不理解前面的描述,说明不是你想要的东西 〖特别说明,要求装有visual Studio2017或更高版本〗
"上周有个做产线扫码器的哥们找我帮忙,他们车间里三十多台扫码枪同时往服务器怼数据,原生的Socket代码动不动就掉线卡死。我直接把现成的C#通信框架甩过去,这货两天就搭好了稳定运行的采集系统——这玩意儿到底藏着什么魔法?"
扔掉线程锁,玩转事件驱动
传统Socket开发最头疼的就是多线程同步和资源竞争。我们这个框架把底层通讯封装成三个核心事件:
// 服务端事件清单 server.OnClientConnected += (clientId) => { /* 新设备接入 */ }; server.OnDataReceived += (clientId, data) => { /* 数据到达 */ }; server.OnClientDisconnected += (clientId) => { /* 连接断开 */ }; // 客户端事件 client.OnConnected += () => { /* 连接成功 */ }; client.OnDisconnected += () => { /* 触发重连机制 */ };比如处理扫码枪数据,只需要在OnDataReceived里写业务逻辑,完全不用操心Socket底层操作。
服务端骨架代码
var server = new SimpleSocketServer(8888); server.Start(); // 设备状态监控 var timer = new System.Timers.Timer(5000); timer.Elapsed += (s, e) => { var onlineDevices = server.ConnectedClients.Count; Console.WriteLine($"当前存活设备:{onlineDevices}台"); }; timer.Start();这段代码暴露了一个设计细节:ConnectedClients属性内部用了ConcurrentDictionary,避免了遍历时的线程安全问题。很多新手自己实现时,这里经常出现诡异的索引越界异常。
客户端的倔强重连
扫码枪可能因网络波动掉线,这个重连机制实测在4G环境下能扛住30秒以上的断网:
var client = new ReconnectableClient("192.168.1.100", 8888); client.RetryInterval = 3000; // 3秒重试一次 client.MaxRetries = 10; // 允许失败10次 client.Connect();内部实现用了状态机模式,通过Disconnected事件触发重连计时器。有个坑要注意:重连前最好延迟1秒,避免立即重连把服务器搞崩。
数据包处理黑科技
处理TCP粘包用了自定义的头部标记法:
// 发送数据时自动添加包头 var payload = Encoding.UTF8.GetBytes("扫码数据:AX0239"); client.Send(payload); // 接收端自动拆包 server.OnDataReceived += (id, data) => { var message = Encoding.UTF8.GetString(data); Console.WriteLine($"[{id}] {message}"); };框架内部采用Header+Body结构,头部4字节保存数据长度。这种方式比固定分隔符更可靠,特别是处理二进制流时优势明显。
文档里藏了个骚操作:在扫码枪项目中,建议在数据尾部追加#MAC地址,这样服务端可以直接定位到具体设备。实测这个方法比单独维护IP映射表省事得多。
Visual Studio 2019实测跑通,注意NuGet需要安装Newtonsoft.Json(虽然示例没用到,但框架依赖它处理配置)。如果遇到SocketException 10048,大概率是端口被占用了——文档里给了快速查找占用进程的PowerShell命令。
这个方案最狠的地方在于,拿去做ModbusTCP通信改造也完全适用。上周刚有个做PLC采集的老哥,把数据解析部分改成字节处理,两天就上线了新的监控系统。所以说,好用的轮子真的能救命。"