Netty 源码剖析与实战
傅健
Netty 源码贡献者、Cisco 高级软件工程师
32935 人已学习
新⼈⾸单¥59
课程目录
已完结/共 60 讲
第一章:初识Netty:背景、现状与趋势 (7讲)
第三章:Netty源码:从“线”(请求处理)的角度剖析 (8讲)
第六章:成长为Netty的贡献者 (6讲)
Netty 源码剖析与实战
登录|注册
留言
19
收藏
沉浸
阅读
分享
手机端
回顶部
当前播放: 12 | TCP粘包/半包Netty全搞定
00:00 / 00:00
高清
  • 高清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.75x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看
01 | 课程介绍
02 | 内容综述
03 | 揭开Netty面纱
04 | 为什么舍近求远:不直接用JDK NIO?
05 | 为什么孤注一掷:独选Netty?
06 | Netty的前尘往事
07 | Netty的现状与趋势
08 | Netty怎么切换三种I/O模式?
09 | 源码剖析:Netty对I/O模式的支持
10 | Netty如何支持三种Reactor?
11 | 源码剖析:Netty对Reactor的支持
12 | TCP粘包/半包Netty全搞定
13 | 源码剖析:Netty对处理粘包/半包的支持
14 | 常用的“二次”编解码方式
15 | 源码剖析:Netty对常用编解码的支持
16 | keepalive与idle监测
17 | 源码剖析:Netty对keepalive与idle监测的支持
18 | Netty的那些“锁”事
19 | Netty如何玩转内存使用
20 | 源码解析:Netty对堆外内存和内存池的支持
21 | Netty代码编译与总览
22 | 源码剖析:启动服务
23 | 源码剖析:构建连接
24 | 源码剖析:接收数据
25 | 源码剖析:业务处理
26 | 源码剖析:发送数据
27 | 源码剖析:断开连接
28 | 源码剖析:关闭服务
29 | 编写网络应用程序的基本步骤
30 | 案例介绍和数据结构设计
31 | 实现服务器端编解码
32 | 实现一个服务器端
33 | 实现客户端编解码
34 | 完成一个客户端雏形
35 | 引入"响应分发"完善客户端
36 | Netty编码中易错点解析
37 | 调优参数:调整System参数夯实基础
38 | 调优参数:权衡Netty核心参数
39 | 调优参数:图解费脑的三个参数
40 | 跟踪诊断:如何让应用易诊断?
41 | 跟踪诊断:应用能可视,心里才有底
42 | 跟踪诊断:让应用内存不“泄露”?
43 | 优化使用:用好自带注解省点心
44 | 优化使用:“整改”线程模型让"响应"健步如飞
45 | 优化使用:增强写,延迟与吞吐量的抉择
46 | 优化使用:如何让应用丝般“平滑”?
47 | 优化使用:为不同平台开启native
48 | 安全增强:设置“高低水位线”等保护好自己
49 | 安全增强:启用空闲监测
50 | 安全增强:简单有效的黑白名单
51 | 安全增强:少不了的自定义授权
52 | 安全增强:拿来即用的SSL-对话呈现表象
53 | 安全增强:拿来即用的SSL-抓包暴露本质
54 | 安全增强:拿来即用的SSL-轻松融入案例
55 | Cassandra如何使用Netty ?
56 | Dubbo如何使用Netty ?
57 | Hadoop如何使用Netty ?
58 | 赏析Netty之美
59 | 如何给Netty贡献代码?
60 | 结课测试&结束语
本节摘要
登录 后留言

全部留言(19)

  • 最新
  • 精选
小不点
学习不是短时间的冲刺,而是有节制的坚持

作者回复: 可持续发展……

2019-10-16
13
公众号-微观技术
固定长度方式,如果一个数据包比较大,超过了缓存区大小,即使头部设置了长度大小,有一部分内容也会放在第二个包传进来,业务处理肯定要求是逻辑上完整的数据包,netty会自动做合包处理吗?

作者回复: 会做的,他会把那个不完整的数据先存起来,等待完整了,再合并起来。然后再往下一级channel handler处理器上传。

2019-10-29
4
6
paradox
请问老师,如果一次性读取了含有多个消息的byteBuf,如 ABC\tBCD\tADC\t,服务端DelimiterBasedFrameDecoder再按照\t接收是不是就是收到了ABC\tBCD\tADC?然后进一步拆分呢

作者回复: 先是一次性收到了ABC\tBCD\tADC\t,然后传给DelimiterBasedFrameDecoder,就会解出三个对象,然后传递给下一级处理器了。所以所以对于下一级来说,它不需要再拆分了。

2019-11-13
5
Gary
如何处理错误呢?比如对端不按TLV方式(第三种)传输,你会解析出一个很大的长度,导致内存溢出,服务崩溃

作者回复: netty解码上,会捕获throwable错误,然后转成exceptionCauget方法调用让你去处理,所以上层怎么处理完全你自己决定了:比如直接把连接断了,让它去重连。另外,设置编解码有个最大长度控制参数,控制了,没那么容易挂

2019-10-16
4
zpzeng
老师,我看SocketChannel注册到workerGroup,是在ServerBootstrap.ServerBootstrapAcceptor#channelRead 方法中,而这个方法调用是在ByteToMessageCodec,MessageToMessageCodec中,这两个和ByteToMessageDecoder,MessageToMessageDecoder有什么区别吗? 然后我看执行过程好像是由pipeline定义的,然后我之前理解是,ServerSocketChannel创建socketChannel之后,是在一个线程里执行执行pipeline的不同阶段。但是现在看着好像是pipeline的每个阶段都要重新注册到group中,选择新的线程执行。是这样吗?能够简单说一下这个过程呢? eventLoopGroup是个什么概念,我现在理解是个线程池一样的东西。 麻烦老师解答一下

作者回复: 1 一个是编码,一个是解码,相当于一个发一个收,编解码的区别主要看输入和输出是什么 2 也可以理解成线程池,他的本质是多个event loop,而一个evnt loop里面只有一个线程,来做绑定到这个event loop里面的多路复用器上发生的事,你看到的每个阶段不是重新注册,是判断每个处理器有没有指定自己的执行器,没有就用最开始选择的那个。如果有,就执行线程切换

2019-10-19
2
冬渐暖
半包的原因:发的数据太大装不下了。。。 我感觉粘包和半包就是类似于平常的断点续传。。。。 找到消息边界 1.关于固定长度,这个我在之前和平安银行对接的时候,他就要求你没有的话就补0...很多老的存储过程也是这样子,这个比一个一个连接好多了。在空间固定的情况下算是不错的选择了。 2.关于加分隔符,我刚参加公司的时候,因为没人带,所以对一些特殊的东西都喜欢加个标签来过滤,比如<wdd></wdd>截取中间的内容。因为多加了东西,这样个人感觉传的时候也是浪费空间,所以我对你说的空间不浪费有点感到疑惑。。。。。。以前是用这种方法,现在感觉好沙雕哈哈,传入解析都需要处理 3.关于固定长度的 我有点没听懂。。。。 我能不能理解为 ①先看这个传进来的有多长,类似于java的“”.length(); 然后再根据长度读这个数据 ②还是先把数据收进来,然后自己想一个合理的长度。。。。。然后读 感觉这个和固定长度差不多啊。。。也是浪费空间啊。。。 我的网络知识比较薄弱。。。。希望老师能解答一下我的这些疑问。。。

作者回复: 1 空间固定的场景应该极少吧,否则都不需要补0了; 2 加分隔符而言,如果内容都不需要转义,那不管长度是否符合要求确实一点不浪费空间,但是你说的也是对的,就是有转义的话,是有一点点浪费的,但是换个角度想,如果有那么多都需要转义,说明你的分隔符有点普通了。 3 比如你的内容是100字节的,所以定义了一个长度字段(比如2个字节),存上数字100,那这样的话,读取的时候,每次都是读那个长度字节(固定2个字节)看看后面的内容长度是多少,比如100,那接下来你就知道要去读100字节了,而不是101什么的。

2019-11-13
2
1
拾年
老师可以说一些学习netty之前要系统的学习哪些相关知识吗,因为平常工作中接触不到这方面的

作者回复: java网络编程,tcp ip协议,主要就这些领域知识

2019-10-16
1
delete is create
老师您好,如果客户端向服务端发送数据 发生了半包问题,假设一共分了3个包, 服务端接收到一个包后 服务端就宕机重启了 那重启后还可以接收到其余的俩个包么

作者回复: 一般都不会收到了,就算收到也没有用,组装不回原来的完整的消息(重启了,所以之前存在内存的半包数据丢了),这种情况,都是需要依赖客户端重试那完成失败的请求。

2019-12-25
jzdayz
固定的分隔符-> http协议 以\n去判定一条一条的header以及requestLine netty对应的实现类io.netty.handler.codec.http.HttpObjectDecoder这里面有一个headerParser 用长度去解析包-> RocketMQ自定义协议,以两个字节(还是四个字节的,忘了)为剩余有效包的长度去解析

作者回复: 补充:http协议里面的content length字段又融合了解length的方式。

2019-10-31
朱延云
推荐+的这种方式,没有很理解,能举例说明下吗?

作者回复: 简单说,就是一个长度字段,然后后面跟着内容,那个长度字段是固定的,比如2个字节,存的就是后面跟着内容的长度,所以读取这个数据的时候,先读固定的那2个字节,拿到长度信息,然后就根据这个长度字节读取后面那么长的数据就行了。

2019-10-24
2
收起评论