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

解决方案 »

  1.   

    XXSocket的种类好多呀,
      

  2.   

    我以前或多或少接触过一些..是不是最少也得有3个回调啊?
    oncon(socket client)onmessage(socket client ,byte[] data)onclose(socket client)
    你这好像只有第二个..另外你的退出,也没有客户端信息啊..最起码 我也得从List<socket> clientlist里移除吧...而且你描述的
    我也没看到"规则".没有规则你如何合并数据?比如一个数据有头有尾有长度有校验..你是如何"动态"合并的呢?
      

  3.   

     有待升级后续版本带上,关于客户端退出,长连接,超时xxx秒,服务端自动断开与之的连接,自动处理分包合并这个,协议规则被封装到内部了,里面有做数据校验操作的, TCP有序的,数据头与实体长度 都在内部自动处理了
      

  4.   

    客户端有退出事件的:
    /// <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;
                }
            }
      

  5.   

    我有一个包 AA-FF-05-00-11-22-33-44-55-BB-CCAA是头 CC是尾  FF表示功能码 05表示长度 然后 11 22 33 44 55表示数据值, BB表示校验..当然可能是一位校验 也可能是2位校验..校验规则呢 可能是CRC32  也可能是累加数据值取最低位 也可能是累加全部取最高位..长度不一定是05 如果我查询温度湿度开关风力,会有更多.硬件上来这一组数据...可能分了3次上来的请问你内部如何解析并且组合成一个完整的有效的数据包?
      

  6.   

    之前在群里 有一个人好像也是自己写了一套tcpserver 说是能自动解析..于是我把需求跟他说了一下 ,完了他好像就退群了..我说这个问题,你不要认为是杠 开发过的人都应该知道这种协议.而且我说的这种协议 是最简单的 使用tcpsever连一些电子产品读取数据比这复杂的多的多了..所以我并不认为 能有"代码"去自动解析这些东西的合法性以及取出我想要的东西...
      

  7.   

    一般成熟的Sokect框架都是自定义包头包尾的
      

  8.   


    只有头尾不行啊. 我以前接触过一个wifi模块 5A开头 A5结束..但是里面的数据 也有5A A5   你还得去根据其他各种规则才能去校验一个完整的包..所以 问题就是在这里.如果头尾就能验证的话.那我也没必要问这么多了 你说是不?
      

  9.   

    你是为啥不信任tcp协议,要自己拆包………………
      

  10.   


    这不是信任的问题..比如某个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  所以你得从这些数据中.提取出来你想要的,并且合法的数据..想到得到这些数据..就得需要头尾长度以及数据校验 才能知道..
      

  11.   


    只有头尾不行啊. 我以前接触过一个wifi模块 5A开头 A5结束..但是里面的数据 也有5A A5   你还得去根据其他各种规则才能去校验一个完整的包..所以 问题就是在这里.如果头尾就能验证的话.那我也没必要问这么多了 你说是不?
    确实这样,包头包尾只能解决一大部分问题,一般还有检验位。
    不过一个成熟的通讯协议中间出现与包头包尾相同的字符的时候会对其转义。
      

  12.   

    AA-FF-05-00-11-22-33-44-55-BB-CC
    硬件上来这一组数据...可能分了3次上来的
    实际上,这算是 自己定义的协议,MiniSocket中,发送的数据,在内部会自动 处理成 类http协议的,取md5码来进行校验,什么开头与什么结尾,实际上 可以定义 一个包头与包体,包头中保存的是 序号,大小,校验码 等,包体中就是数据实体,MiniSocket的Send函数对所发送的HeaderByt 与BodyByt实际上是指 应用层面的 发送,内部自动处理了 它们的校验