MiniSocket 简单易用的socket tcp开发包 .net core

「已注销」 2019-10-10 09:22:39
MiniSocket 采用socket tcp方式通讯,自动处理分包合并,性能高,使用简单,非常容易进行二次开发

服务端使用:打开vs2017 新建.net core(2.1版本以上) 控制台应用,nuget搜索MiniSocket 下载

代码:

        static void Main(string[] args)
        {
            // 实际化服务端对象
            Network server = new Network();
            // 设置ip地址
            server.Ip = "127.0.0.1";
            // 设置端口号
            server.Port = 9123;
            // 设置客户端最大连接数
            server.ClientMaxCnt = 10;
            // 设置接收超时
            server.ReceiveTimeout = 1000 * 100;
            // 设置发送超时
            server.SendTimeout = 1000 * 100;
            // 设置接收缓冲区大小
            server.RecvBufferSize = 1024;
            // 设置工作线程数
            server.WorkThreadCnt = 20;
            // 设置客户端超时时间(秒)
            server.TimeOver = 30;
            // 设置接收完成事件
            server.RecvCompleted += RecvEventData;
            // 初始化
            bool bl =  server.Init();
            while(true)
            {
                Thread.Sleep(1000);
            }
        }

        /// <summary>
        /// 接收完成事件
        /// </summary>
        /// <param name="e"></param>
        /// <param name="sockArgs"></param>
        private static void RecvEventData(Network e,SocketParas sockArgs)
        {

            try
            {
                string str_head = Encoding.UTF8.GetString(sockArgs.HeadByt);
                string str_body = Encoding.UTF8.GetString(sockArgs.BodyByt);

                e.Send(sockArgs, Encoding.UTF8.GetBytes("this is header"), Encoding.UTF8.GetBytes("this is body"));
            }
            catch(Exception ex)
            {
                Print("RecvEventData "+ex.Message);
            }
        }

客户端使用:打开vs2017 新建.net framework(4.0版本以上) 控制台应用,nuget搜索MiniSocketClient 下载

代码:

       static void Main(string[] args)
        {
            // 实例化客户端对象
            Network client = new Network();
            // 设置ip地址
            client.Ip = "127.0.0.1";
            // 设置端口号
            client.Port = 9123;
            // 设置接收超时
            client.ReceiveTimeout = 1000 * 30;
            // 设置发送超时
            client.SendTimeout = 1000 * 30;
            // 设置接收缓冲区大小
            client.ReceiveBufferSize = 1024;
            // 接收完成事件
            client.RecvCompleted += RecvComplete;
            // 退出事件
            client.ExitCompleted += ExitCompleted;
            // 初始化
            client.Init();
            // 发送第一包数据
            client.Send(Encoding.UTF8.GetBytes("hello china"), Encoding.UTF8.GetBytes("hello world"));

            while (true)
            {
                Thread.Sleep(10);
            }

        }



/// <summary>
        /// 接收完成事件
        /// </summary>
        /// <param name="e"></param>
        /// <param name="sockArgs"></param>
        private static void RecvComplete(Network e, SocketParas sockArgs)
        {
            try
            {

                Console.WriteLine(Encoding.UTF8.GetString(sockArgs.HeadByt) + Encoding.UTF8.GetString(sockArgs.BodyByt));
                e.Send(Encoding.UTF8.GetBytes("hello world"), Encoding.UTF8.GetBytes("hello MiniSocket"));
            }
            catch (Exception ex)
            {
                Print("RecvComplete " + ex.Message);
            }
        }

        /// <summary>
        /// 发送完成事件
        /// </summary>
        /// <param name="e"></param>
        /// <param name="sock"></param>
        private static void SendComplete(Network e, SocketParas sock)
        {

        }

        /// <summary>
        /// 退出事件
        /// </summary>
        /// <param name="state"></param>
        /// <param name="msg"></param>
        private static void ExitCompleted(int state, string msg)
        {
            switch (state)
            {
                case 0: // 正常
                    break;
                case 1: // 连接异常
                    break;
                case 2: // 发送异常
                    break;
                case 3: // 接收异常
                    break;
                case 4: // 手动强制退出
                    break;
            }
        }

...全文
571 12 打赏 收藏 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2019-10-18
  • 打赏
  • 举报
回复
AA-FF-05-00-11-22-33-44-55-BB-CC 硬件上来这一组数据...可能分了3次上来的 实际上,这算是 自己定义的协议,MiniSocket中,发送的数据,在内部会自动 处理成 类http协议的,取md5码来进行校验,什么开头与什么结尾,实际上 可以定义 一个包头与包体,包头中保存的是 序号,大小,校验码 等,包体中就是数据实体,MiniSocket的Send函数对所发送的HeaderByt 与BodyByt实际上是指 应用层面的 发送,内部自动处理了 它们的校验
大鱼> 2019-10-13
  • 打赏
  • 举报
回复
引用 8 楼 by_封爱的回复:
[quote=引用 7 楼 HyoJung 的回复:] 一般成熟的Sokect框架都是自定义包头包尾的
只有头尾不行啊. 我以前接触过一个wifi模块 5A开头 A5结束.. 但是里面的数据 也有5A A5 你还得去根据其他各种规则才能去校验一个完整的包.. 所以 问题就是在这里. 如果头尾就能验证的话.那我也没必要问这么多了 你说是不?[/quote] 确实这样,包头包尾只能解决一大部分问题,一般还有检验位。 不过一个成熟的通讯协议中间出现与包头包尾相同的字符的时候会对其转义。
by_封爱 版主 2019-10-12
  • 打赏
  • 举报
回复
引用 9 楼 胖叔叔写代码 的回复:
你是为啥不信任tcp协议,要自己拆包………………
这不是信任的问题.. 比如某个wifi模块发送一组tcp数据到服务端 11.22.33.44.55 那么服务端可能收到2或者多次onmessage事件 第一次收到11.22 第二次收到33 44 55. 也可能11.22 33.44 55 如果连续发送2次包. 那么你可能收到的是 11.22 33.44 55.11.22 33 44.55 所以你得从这些数据中.提取出来你想要的,并且合法的数据.. 想到得到这些数据..就得需要头尾长度以及数据校验 才能知道..
  • 打赏
  • 举报
回复
你是为啥不信任tcp协议,要自己拆包………………
by_封爱 版主 2019-10-12
  • 打赏
  • 举报
回复
引用 7 楼 HyoJung 的回复:
一般成熟的Sokect框架都是自定义包头包尾的
只有头尾不行啊. 我以前接触过一个wifi模块 5A开头 A5结束.. 但是里面的数据 也有5A A5 你还得去根据其他各种规则才能去校验一个完整的包.. 所以 问题就是在这里. 如果头尾就能验证的话.那我也没必要问这么多了 你说是不?
大鱼> 2019-10-12
  • 打赏
  • 举报
回复
引用 6 楼 by_封爱 的回复:
之前在群里 有一个人好像也是自己写了一套tcpserver 说是能自动解析.. 于是我把需求跟他说了一下 ,完了他好像就退群了.. 我说这个问题,你不要认为是杠 开发过的人都应该知道这种协议. 而且我说的这种协议 是最简单的 使用tcpsever连一些电子产品读取数据比这复杂的多的多了.. 所以我并不认为 能有"代码"去自动解析这些东西的合法性以及取出我想要的东西...
一般成熟的Sokect框架都是自定义包头包尾的
by_封爱 版主 2019-10-12
  • 打赏
  • 举报
回复
之前在群里 有一个人好像也是自己写了一套tcpserver 说是能自动解析.. 于是我把需求跟他说了一下 ,完了他好像就退群了.. 我说这个问题,你不要认为是杠 开发过的人都应该知道这种协议. 而且我说的这种协议 是最简单的 使用tcpsever连一些电子产品读取数据比这复杂的多的多了.. 所以我并不认为 能有"代码"去自动解析这些东西的合法性以及取出我想要的东西...
by_封爱 版主 2019-10-12
  • 打赏
  • 举报
回复
引用 3 楼 每天好羊毛 的回复:
有待升级后续版本带上,关于客户端退出,长连接,超时xxx秒,服务端自动断开与之的连接,自动处理分包合并这个,协议规则被封装到内部了,里面有做数据校验操作的, TCP有序的,数据头与实体长度 都在内部自动处理了
我有一个包 AA-FF-05-00-11-22-33-44-55-BB-CC AA是头 CC是尾 FF表示功能码 05表示长度 然后 11 22 33 44 55表示数据值, BB表示校验.. 当然可能是一位校验 也可能是2位校验.. 校验规则呢 可能是CRC32 也可能是累加数据值取最低位 也可能是累加全部取最高位.. 长度不一定是05 如果我查询温度湿度开关风力,会有更多. 硬件上来这一组数据...可能分了3次上来的 请问你内部如何解析并且组合成一个完整的有效的数据包?
「已注销」 2019-10-12
  • 打赏
  • 举报
回复
客户端有退出事件的: /// <summary> /// 退出事件 /// </summary> /// <param name="state"></param> /// <param name="msg"></param> private static void ExitCompleted(int state, string msg) { switch (state) { case 0: // 正常 break; case 1: // 连接异常 break; case 2: // 发送异常 break; case 3: // 接收异常 break; case 4: // 手动强制退出 break; } }
「已注销」 2019-10-12
  • 打赏
  • 举报
回复
有待升级后续版本带上,关于客户端退出,长连接,超时xxx秒,服务端自动断开与之的连接,自动处理分包合并这个,协议规则被封装到内部了,里面有做数据校验操作的, TCP有序的,数据头与实体长度 都在内部自动处理了
by_封爱 版主 2019-10-11
  • 打赏
  • 举报
回复
我以前或多或少接触过一些.. 是不是最少也得有3个回调啊?

oncon(socket client)

onmessage(socket client ,byte[] data)

onclose(socket client)
你这好像只有第二个.. 另外你的退出,也没有客户端信息啊..最起码 我也得从List<socket> clientlist里移除吧... 而且你描述的
引用
自动处理分包合并
我也没看到"规则".没有规则你如何合并数据? 比如一个数据有头有尾有长度有校验..你是如何"动态"合并的呢?
  • 打赏
  • 举报
回复
XXSocket的种类好多呀,
内容概要:本文档是《Video for Linux Two API 规范》第0.24版的中文手册,系统性地介绍了V4L2(Video for Linux 2)的核心API及其使用方法。内容涵盖设备打开与关闭、能力查询、视频与音频输入输出管理、调谐器与调制器配置、视频标准选择、用户与扩展控制、数据格式协商、图像裁剪缩放、流控参数设置,以及多种I/O传输方式(如read/write、内存映射、用户指针等)。手册还详细定义了各类图像像素格式(如YUV、RGB、压缩格式)、缓冲区管理机制和ioctl控制接口,并附有编程示例和驱动开发指导,全面支持从基础捕获到高级视频处理的应用开发。; 适合人群:从事Linux平台下音视频驱动或应用程序开发的工程师,尤其是具备C语言基础并熟悉系统级编程的研发人员;适用于1-5年经验的嵌入式、多媒体或驱动开发者。; 使用场景及目标:① 开发基于摄像头、电视卡、视频采集卡等设备的Linux视频应用;② 实现视频采集、格式转换、流媒体传输、overlay叠加显示等功能;③ 调试和优化V4L2兼容硬件的驱动程序;④ 理解并运用ioctl接口进行设备控制与状态查询。; 阅读建议:建议结合实际硬件环境边学边练,优先通过VIDIOC_QUERYCAP确认设备能力,再逐步配置输入源、数据格式与I/O方式;注意各结构体字段的初始化与对齐要求,关注版本变更带来的兼容性问题,可参考附录示例代码进行调试验证。
数据集可视化效果见下方。 【数据集概况】 · 检测类别(中文):[自行车(bicycle), 公交车(bus), 汽车(car), 行人(person), 骑行者(rider), 踏板车(scooter), 卡车(truck)] · 训练集:1334 张 · 验证集:571 张 · 测试集:0 张 · 总计:1905 张 该数据集基于激光雷达点云生成的二维投影图像,真实还原了城市道路复杂交通场景下的多目标检测需求。图像呈现为典型的鸟瞰视角或前视视角的点云密度图,清晰捕捉到包括汽车、卡车、公交车、自行车、踏板车及行人等各类交通参与者在城市街道中的动态分布。数据集聚焦于高密度交通环境下的目标识别,具备高度的现实应用价值,可有效支撑智能交通系统、自动驾驶感知模块及城市安防监控等领域的技术开发。... 【训练曲线与评估图】 【模型训练配置】 参数 | 值 模型 | yolo26n 训练轮数 | 100 epochs 输入尺寸 | 640x640 批次大小 | 24 优化器 | auto 初始学习率 | 0.01 训练设备 【关键指标汇总】 训练了 100 个 epoch,最终轮指标: 指标 | 数值 mAP50 | **0.6355** mAP50-95 | 0.3557 Precision | 0.6116 Recall | 0.6067 train/box_loss | 1.3609 train/cls_loss | 1.1274 val/box_loss | 1.5101 val/cls_loss | 1.2023 【训练过程分析】 100 轮训练后 mAP50 仅 0.6355,模型收敛不充分。Loss 曲线前期下降后进入平台期,mAP 提升缓慢。mAP50-95 为 0.3557,定位精度同样偏低。 【模型性能评估】 Precision 0.6116、Recall ...
代码转载自:https://pan.quark.cn/s/a4b39357ea24 一、背景 对近一年以来(2024年H2~2025年H1),在部门非雇员OD管理中出现的主动管理、计划外离职等数据进行整理和复盘,提炼出OD招聘和管理中的经验教训,指导我们在选、用、育、留等各环节的改进,尤其在综合面试环节需要强化一些面试要素,持续优化面试环节的标准和管理过程中差异化的管理方案,提升OD的有效留存率。 二、问题/事件描述 部门近一年时间(2024年H2~2025年H1),出现约9例OD离职(含主动管理)情况,占比约7%,一定程度影响了OD的有效贡献率,本文对数据进行整理和提炼,识别风险因素,提炼共性原因,思考改进方案。 三、分析与对策 WXX - 基本数据:2002年生人,独生子女,流转资源,OD在岗4个月,985学校毕业,非软件专业(金融类专业) - 特征:自学习了一些Python就通过考试进入面试环节 - 面试环节复盘:综面环节第一次没有通过,但因业务需求紧迫,XM对人力补充比较迫切,再三沟通后,综面勉强通过 - 工作中结果:工作中与人交流不多,工作几个月攒到一些收入就准备离职出去玩。 主动离职 FXX - 基本数据:2002年生人,独生子女,流转资源,OD工作3个月,成绩较好,专业对口,父母为国企职工 - 特征:候选人沟通积极,思路清晰 - 面试环节复盘:综面意见较好,沟通比较积极,入职体检正常。 当时团队交付压力大,需要补充新鲜力量。 综面正常通过 - 工作中结果:入职后就经常生病(感冒等),工作后就隔三差五请假看病,整体出勤率低于50%时间,无法有效安排工作。 后主动管理 SXX - 基本数据:2001年生人,独生子女,OD工作2年,985大学环境专业,有一段时...

111,128

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧