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