Tcp
    https://www.cnblogs.com/zbllly/p/10317966.html
    https://www.cnblogs.com/aspirant/p/11334957.html
    https://zhuanlan.zhihu.com/p/355739010
    Socket
    https://www.jianshu.com/p/cde27461c226
    Mtqq
    https://gitee.com/wizzer/MqttWk
    https://gitee.com/quickmsg/mqtt-cluster 微服务
    https://blog.csdn.net/qq_37949192/article/details/103962848
    https://gitee.com/xuangroup/socket-mqtt
    https://blog.csdn.net/qq_41854291/article/details/115721493
    Netty
    https://www.jianshu.com/p/3a770d58797f netty线程池
    https://www.5axxw.com/wiki/content/ha92fi netty教程
    https://www.5axxw.com/wiki/content/bf8502 netty断开重连
    https://crycrycry.blog.csdn.net/article/details/116497444? 断开重连
    https://developer.aliyun.com/article/290834 netty原理ByteBuf的相关操作
    https://netty.io/5.0/api/?spm=a2c6h.12873639.article-detail.4.fd767e811W0tAe nettyapi5.0
    https://blog.csdn.net/wdclown/article/details/105396187
    https://blog.csdn.net/u010460625/article/details/117286404 物联网自定义协议
    https://gitee.com/willbeahero/IOTGate 通过netty实现自定义协议物联网网关(单机和集群版)
    https://www.cnblogs.com/wunaozai/p/11403015.html 物联网架构成长之路(35)-利用Netty解析物联网自定义协

    https://blog.csdn.net/zhouzhiwengang/article/details/112213243 心跳机制
    https://www.cnblogs.com/leap/p/5352772.html 心跳机制
    https://blog.csdn.net/qq_16669583/article/details/106266021 解码
    https://www.cnblogs.com/caoweixiong/p/14663492.html
    https://www.jianshu.com/p/38a3546098ae 校验码
    netty粘包拆包
    https://blog.csdn.net/wwwzhouzy/article/details/119154039
    https://www.cnblogs.com/xdecode/p/7913509.html
    https://blog.51cto.com/u_15060464/2638245
    https://www.iteye.com/blog/wx1569571209-2499518
    https://blog.csdn.net/qq_36665310/article/details/122281267 修改默认缓冲区1024大小
    https://blog.csdn.net/FlyLikeButterfly/article/details/82024005 利用 LengthFieldBasedFrameDecoder
    https://www.jianshu.com/p/b23041884f84 tcp粘包拆包及ByteToMessageDecoder
    https://www.jianshu.com/p/d999009a0a47 利用 LengthFieldBasedFrameDecoder 解决
    https://blog.csdn.net/weixin_43275277/article/details/106737320 如何解决netty自定义协议粘包分包问题
    https://blog.csdn.net/CodeDabaicai/article/details/113566254 Netty-Unpooled类-细节使用
    https://www.cnblogs.com/Courage129/p/14276926.html Unpooled类
    https://blog.csdn.net/Coder_py/article/details/72835351 Netty使用LineBasedFrameDecoder解决粘包问题
    https://blog.csdn.net/prestigeding/article/details/53977445 源码分析Netty系列
    https://blog.csdn.net/cgj296645438/article/details/90667419 netty 中LengthFieldPrepender与LengthFieldBasedFrameDecoder
    LengthFieldBasedFrameDecoder解析_你的酒窝里有酒的博客-CSDN博客
    Netty4系列 LengthFieldBasedFrameDecoder的用法_Viscu的博客-CSDN博客
    【看完就会】Netty的LengthFieldBasedFrameDecoder的用法详解(转)_HSJ0170的博客-CSDN博客
    netty(三)LengthFieldBasedFrameDecoder解码器的使用例子_ycllycll的博客-CSDN博客
    LengthFieldBasedFrameDecoder使用示例-百度文库
    netty丢包
    https://blog.csdn.net/hxx688/article/details/122752690 各种优化
    https://blog.csdn.net/han949417140/article/details/122989354 再优化
    https://www.jiangyuesong.me/netty-drop-data 修改服务器线程池参数
    https://www.shuzhiduo.com/A/kjdwAYbGJN/ 主要丢包原因及具体问题分析
    https://blog.csdn.net/lmq2582609/article/details/89152595? 优化
    1、接收端处理时间过长导致丢包:调用recv方法接收端收到数据后,处理数据花了一些时间,处理完后再次调用recv方法,在这二次调用间隔里,发过来的包可能丢失。对于这种情况可以修改接收端,将包接收后存入一个缓冲区(线程处理复杂数据),然后迅速返回继续recv。
    https://blog.csdn.net/zjturn/article/details/9014831
    https://bbs.csdn.net/topics/391905524?t=1487858287674 netty4服务端接收数据丢包

    netty 代码结构:
    NettyServer (线程启动)
    ^
    serverBootstrap.childHandler(new NettyServerInitializer()) (入口网关)
    ^
    注册这3个 SxsbDecoder(收到消息解码器) SxsbEncoder(消息编码后发送) SxsbHandler ( channelRead0 这个方法负责接收和发送,接收后回调解码器,发送前回调编码器)

    netty自定义协议执行顺序:
    1.SxsbHandler extends SimpleChannelInboundHandler<SxsbProtocol> 的 channelActive方法(连接成功触发) ->
    2.SxsbHandler extends SimpleChannelInboundHandler<SxsbProtocol> 的方法 channelRead0 接收数据,回调下面的解码器
    2.SxsbDecoder extends ByteToMessageDecoder 的 decode方法(解码器收到本次缓冲所有数据包,当接收到最后1个数据包的时候发给SxsbHandler out.add(sxsbProtocol);)
    这里解释一下:
    buffer.readBytes 方法,如果缓冲区100字节,在decode方法只读80字节,该方法执行完毕后,还会一直执行 decode方法,知道读取完毕,或者 buffer.skipBytes 跳过剩下的字节
    缓冲区就像一个山洞,进来的,都要出去,或者丢弃,或者1个都不读

    1. 解码完毕后最终完整数据sxsbProtocol还给 channelRead0 ,调用 ctx.writeAndFlush(protocol); 发给客户端,发送文本不可以,接收不到,只能是协议对象,writeAndFlush回调下面的方法
    2. SxsbEncoder extends MessageToByteEncoder<SxsbProtocol>的 encode(ByteBuf out) 方法 out.writeBytes(msg.getZldm()); 内容被写入 ByteBuf 缓冲区,最后回到 channelRead0 的 writeAndFlush 发送给客户端
    3. buffer缓冲区,本次读取,如果readindex 置为开始位置,下次缓冲区,再读进来包含上次和这次缓冲区的内容,叠加

    EMQ中间件
    https://www.jianshu.com/p/a3cac6e401ef