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;
            }
        }

...全文
497 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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的种类好多呀,
.net 稳定 高效 易用 可同步 TCP 通信框架 使用平台: WinXP,WIN7,WIN8,WINCE,WINPHONE。 使用.net 2.0 框架。 主要功能介绍: 1、可以代替 Oracle,Mysql客户端 在不安装Oracle,MySql客户端的情况下访问, 对数据库进行间接访问(需开始框架的服务器端)。 2、可以使本来没有网经功能的Sqlite具有网络访问的能力。(也是需要开启服务器端) 以上两点可以兼容现有代码生成器时,客户端代码仅需要特别小的改动就可以。 3、基本功能。可以实现聊天,传文件,图片。 4、使用长连接,有断线自动连接功能,心跳包。 5、使用自定义数据包协议,自建Session机制加强数据连接安全。 6、框架稳定,支持高并发。 7、简单的事件处理机制。使用更加简单。 8、支持同步处理,使程序的开发更架简单,不需要另行回调处理。 下载地址: 使用方式: 首选需要 引用 DataUtils.v1.1.dll。DataUtils 内包含客户端与服务器端 处理类。 1、服务器端 代码示例。 设置服务器端默认端口 ,不设置端口会使用默认端口 TcpSettings.DefultPort = 8511; 既可以使用静态默认对象,也可以创建服务器端对象。 SocketListener server= new SocketListener(); 对象创建后 注册一些事件,以接收客户端发送的信息。 SocketListener.Server.RegeditSession += new Feng.Net.Tcp.SocketListener.RegeditSessionEventHandler(server_RegeditSession); RegeditSession 事件用于是否允许客户端连接此服务器。可以使用用户名,密码的核对方式。 SocketListener.Server.DataReceive += new SocketListener.DataReceiveEventHandler(server_DataReceive); DataReceive 在这个事件里处理接收到的数据。 事件注册完成就可以打开监听 SocketListener.Server.StartListening(); 2、客户端 代码示例 设置服务器的IP地址 TcpSettings.DeafultIPAddress = "192.168.1.3"; TcpSettings.DefultPort = 8511;//不设置端口会使用默认端口。 这样就可以使用默认的静态客户端了。 也可以自己创建对象。 客户端创建后需要在Connected事件注册用户,以限制某些用户是否可以使此链接。用户来源可以是数据库等。 void client_Connected(object sender, SocketClient sh) { Client.RegeditSession("aaa", "bbb"); } 发送文字消息给其他用户 SocketClient.Client.SendToOtherUser(string user, string text); //USER代表发达的目白用户,text表示为发送的内容。 发送图片,音频,视屏可以使用 SocketClient..SendToOtherUser(string user, byte[] data)////USER代表发达的目白用户,data表示为发送的内容。 data数据中数据有多种类型时可以使用 using (Feng.IO.BufferWriter bw = new Feng.IO.BufferWriter()) { bw.WriteBitmap(new Bitmap(100, 100)); bw.Write(text);

111,097

社区成员

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

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

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