[开果] 一个简单 小型的C#Socket网络通信库的制作(服务器客户端互通)(上)
本帖最后由 开果 于 2019-8-1 14:44 编辑

大家好我是匠人团队的开果


就一个不用 理解之间的通信代码原理之类的   几句代码快速搭建服务器和客户端的

思维导图:




过程大概是KGSocketClient/KGSocketServe 创建了KGNetSession 会话管理进行发送/接收数据的监听会进行一次开启事件 OnStartRecive() 函数回调, 监听到的数据包KGNetPacket 通过KGPackExtension 转化成KGNetData自已定义的数据结构类,然后在KGNetSession里面的  OnReciveData(T) 函数 进行回调   

下面直接开始代码解析

1.KGNetData  自定义的数据类


这个好像没啥好说的=。= 自定义的数据类都要继承他



[mw_shl_code=csharp,false]    //传输的数据都必须打上可序列化的标签
    [Serializable]
      public abstract class KGNetData
        {
            public int Err;
            public int Cmd;
        }
    [/mw_shl_code]



2.KGNetPacket 消息包的数据类




因为每条消息包 你不知道他的长度 所以要在前面利用BitConverter.GetBytes获取一个包的长度Int值

这个int就站byte[]四个长度  所以HeadLength=4,然后获取到长度了在SetPackLen给PacketBuff赋值上获取到的长度


[mw_shl_code=csharp,true]     public class KGNetPacket
        {
   
            public byte[] PacketBuff;
            public int HeadLength = 4;//这里是标头的长度
            public int HeadIndex;//这里有时候分包接收到一两个 所以要进行记录已经接收到两个了 还差几个
   
            public int PacketBuffLength ;//数据包的长度
            public int PacketIndex;//和上面一样意思
   
            /// <summary>
            /// 获取四个字节转成的int长度
            /// </summary>
            /// <param name="data"></param>
            /// <returns></returns>
            public  void SetPackLen()
            {
                PacketBuffLength = BitConverter.ToInt32(PacketBuff, 0);
                PacketBuff =new byte[PacketBuffLength];
            }
   
   
            public void Refresh()
            {
                PacketBuff = null;
                PacketIndex = 0;
                HeadIndex = 0;
            }
        }
[/mw_shl_code]
3.KGPackExtension 打消息包拓展工具类








4.KGLog 打印消息的 工具类
所有打印都是通过KLog()进行打印的 在别的地方可以在LogEvent就可以获取到打印事件了

[mw_shl_code=csharp,false]
    /// <summary>
    /// 打印消息的工具拓展类
    /// </summary>
    public static class KGLog
    {
        public static bool RunLog = true;

        //留的一个打印事件委托
        private static  Action<string, LogLevel> LogEvent = null;

        //这里是打印消息的方法
        public static void KLog(this string Logdata,LogLevel logLevel=LogLevel.Common)
        {
            if (!RunLog)
                return;

            LogEvent?.Invoke(Logdata,logLevel);

            Console.WriteLine("{0}-----------------{1}", Logdata,logLevel.ToString());
         

        }

        public static void SetLog(this Action<string, LogLevel> log,bool Run=true)
        {
            LogEvent = log;
            RunLog = Run;
        }
    }

    //打印等级
    public enum  LogLevel
    {
        None=0,
        Common=1,
        Warn=2,
        Err=3

    }
[/mw_shl_code]

好了我们下篇继续

工程地址
游客,如果您要查看本帖隐藏内容请回复
萌新QQ群844087555 欢迎进来灌水=。=







666666666666666666
udsdajkfhkj
不错不错
感谢楼主
学习了,谢谢分享

学习了,谢谢分享
看着很不错啊
666666学习一下
学习到了,感谢分享
  • 11# fist
  • 4 天前
感谢分享~~
学习学习
谢谢~~~~~~~~~~~~~
这就是大佬了吧
不错不错
12下一页