当前播放: 36 | Netty编码中易错点解析
00:00 / 00:00
高清
  • 高清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看
课程目录
第一章:初识Netty:背景、现状与趋势 (7讲)
01 | 课程介绍
免费
02 | 内容综述
免费
03 | 揭开Netty面纱
免费
04 | 为什么舍近求远:不直接用JDK NIO?
免费
05 | 为什么孤注一掷:独选Netty?
免费
06 | Netty的前尘往事
07 | Netty的现状与趋势
第二章:Netty源码:从“点”(领域知识)的角度剖析 (13讲)
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对堆外内存和内存池的支持
第三章:Netty源码:从“线”(请求处理)的角度剖析 (8讲)
21 | Netty代码编译与总览
22 | 源码剖析:启动服务
23 | 源码剖析:构建连接
24 | 源码剖析:接收数据
25 | 源码剖析:业务处理
26 | 源码剖析:发送数据
27 | 源码剖析:断开连接
28 | 源码剖析:关闭服务
第四章:Netty实战入门:写一个“玩具”项目 (8讲)
29 | 编写网络应用程序的基本步骤
30 | 案例介绍和数据结构设计
31 | 实现服务器端编解码
32 | 实现一个服务器端
33 | 实现客户端编解码
34 | 完成一个客户端雏形
35 | 引入"响应分发"完善客户端
36 | Netty编码中易错点解析
第五章:Netty实战进阶:把“玩具”变成产品 (18讲)
37 | 调优参数:调整System参数夯实基础
38 | 调优参数:权衡Netty核心参数
39 | 调优参数:图解费脑的三个参数
40 | 跟踪诊断:如何让应用易诊断?
41 | 跟踪诊断:应用能可视,心里才有底
42 | 跟踪诊断:让应用内存不“泄露”?
43 | 优化使用:用好自带注解省点心
44 | 优化使用:“整改”线程模型让"响应"健步如飞
45 | 优化使用:增强写,延迟与吞吐量的抉择
46 | 优化使用:如何让应用丝般“平滑”?
47 | 优化使用:为不同平台开启native
48 | 安全增强:设置“高低水位线”等保护好自己
49 | 安全增强:启用空闲监测
50 | 安全增强:简单有效的黑白名单
51 | 安全增强:少不了的自定义授权
52 | 安全增强:拿来即用的SSL-对话呈现表象
53 | 安全增强:拿来即用的SSL-抓包暴露本质
54 | 安全增强:拿来即用的SSL-轻松融入案例
第六章:成长为Netty的贡献者 (6讲)
55 | Cassandra如何使用Netty ?
56 | Dubbo如何使用Netty ?
57 | Hadoop如何使用Netty ?
58 | 赏析Netty之美
59 | 如何给Netty贡献代码?
60 | 课程回顾与总结
36 | Netty编码中易错点解析

36 | Netty编码中易错点解析

傅健
Netty源码贡献者、Cisco高级软件工程师
60讲 约670分钟4517
单独订阅¥129
2人成团¥99
1
本节摘要
登录 后留言

精选留言(10)

  • 夷,这也可以
    老师,我问个比较业余的问题,因为你这个案例完全是基于tcp协议来的,所以第一次和第二次编解码也是自定义。客服端和服务端都是必须是同一套编解码。netty对其他协议的支持(http、mqtt等)就是根据消息协议的格式约定,实现数据的第一次和第二次编解码。当然也可能把第一次和第二次统一封装成一个编码类方便api调用。不过底层数据传输走的还是这几个步骤。也就是netty都可以看做4+1的处理方式来实现各种协议的网络传输处理。不知道理解的对不对?

    作者回复: 对于tcp大多如此的,但是有一种情况,就是如果你接受到数据,立马就转走,像路由器一样,那这个时候,你的处理就不需要那么多层次的编解码了,因为你不做处理,只是二转手,就像快递员一样,不会拆你的快递一样,就是给你转走;
    不是这种情况下,大多都需要4+1, 4是2组:1组处理粘包:1组处理转化给用户好用/存储。最后那个1业务处理。

    2019-11-17
    1
  • zpzeng
    老师,对于channelHandler是否共享有没有什么一般性原则,判断依据。我感觉demo里Server端的几个Handler都没有对传入的参数引用做保存,修改操作,我觉得并发没问题,那是不是就可以全部都共享。

    作者回复: 你这个感觉很好,我也是这么判断的,除了这点之外,你分2种情况看:别人写的和自己要写的,如果是别人写的,你看它可标记成@sharable了。如果自己写的,自己最清楚了,主要看可有线程安全和是否符合自己的需求,比如你统计整个系统的,一般都要做成共享的,如果你统计单一连接的,你肯定就是非共享的,不管用哪种方式去看,自己去实际分析代码最准确。其中就有你说的那个小方法,就是看那个类可有成员变量,如果一个没有,十有八九都可以共享。

    2019-11-16
    1
  • Gary
    老师您好,为什么注册时inboundhandler中夹着outboundhandler,不是先写完inboundhandler再写outboubdhandler?

    作者回复: 这个问题很好,其实是风格问题,你说的那样也可以,但是现在大多都是按照我那样的写法写,因为体现一对一对的感觉,很清晰,如果按照你想要的那种写法,其实让别人看到的是那种业务逻辑处理的感觉了,然后读者还要去读去找,看看你是不是一对一对的了。

    2019-11-14
    1
    1
  • 学习
    老师,handler的顺序那里还是没太懂,为什么两个encodeHandler放在frameDecodeHandler后面呢

    作者回复: 读保证自上而下,写保证自下而上就行了,读与写之间其实顺序无所谓,但是一般为了好看对称,我们是一组一组写。案例中的顺序功能是没有问题的,只是让你产生了疑惑。
    你提出的这个不懂,我觉得我可以改下,但是如果我改了,或许你就没有这个问题了,哈哈,所以我要考虑下好看与教学效果之间做个平衡。

    2019-12-08
  • 夷,这也可以
    有一种情况,就是如果你接受到数据,立马就转走,像路由器一样,那这个时候,你的处理就不需要那么多层次的编解码了,因为你不做处理,只是二转手,就像快递员一样,不会拆你的快递一样,就是给你转走;
    老师这种情况一般是1层编解码还是不需要?我的一个疑问是,路由转发也是有一定规则的,这个规则的判断也是需要对信息识别的,那还是要编解码呀?还是说传输过程中也有类似快递单号那样特殊消息(这个特殊消息是否需要编解码呢?)能帮我们,理解不到位,请老师指教!

    作者回复: 是的,你说的对的,我感觉你很理解了,看需求,比如你不需要根据信息里面的内容做判断(比如),你就直接中转扔出去,但是像快递那个例子,你要看下编号什么的,那就做一层解码,然后扔出去,所以说做几层看业务需求,大多都是二层。

    2019-11-21
  • Gary
    也许是个人对java刚接触不久,一直从事c++开发的原因,感觉应该从第四章开始学,学完了用法示例再看前面的原理和源码分析效果更好。

    作者回复: 是的,有其他人也反映顺序的设置是否像你说的那样更合理,当时考虑是说netty的案例真的挺简单的,上来直接说,缺乏一点基础的人,肯定觉得很晕,不知道在讲什么,所以就故意把顺序颠倒过来,这样可能更适合新手,但是也出现一些有经验的人,觉得这样的设计没有先案例后原理的好,所以只能建议反过来再看一遍,因为确实有的时候,一次看不明白,就需要翻书对照着看,好在总时长不长,就当复习也可以。

    2019-11-19
  • 小不点
    呦西,学到了学到了,周三再见了。。。

    作者回复: 你快坚持到底了,哈哈

    2019-11-18
  • 十年
    老师,请问业务处理层,一般会使用spring管理bean,集成mybatis吗?

    作者回复: 可以的,业务层就是我们自己的业务逻辑了,随便怎么搞都可以。

    2019-11-15
  • 鱼向北游
    感觉channel.writeandflush也挺常见呀,有时候接的消息为了解耦是直接放队列,然后消费调rpc,等rpc返回的时候一般找的都是channel呀,再用writeandflush写出去,好像那时候就没ctx了

    作者回复: 客户端常见,服务器端见的少些,还是看具体需求,但是一定要搞清楚两者之间区别,否则要不多绕了一圈,要不就搞出问题了。当然有很多时候也不出问题,这里列出来的意思就是让大家要搞清楚这两个不一样,写的时候,小心点,如果用好了,能节约调用。

    2019-11-15
  • 吃饭饭
    有个地方不明白:我们自定义的消息包含 Body 和 Header,为了解决粘包和半包需要添加一个 Length 字段,但是我没找到处理这个实际处理的地方呢,难道仅仅设置一个 lengthFieldLength = 2 就可以实现解析自定义的消息吗?

    作者回复: 是的,处理的逻辑在netty自己的类里面:LengthFieldBasedFrameDecoder,可以回看12-13节内容。参考io.netty.handler.codec.LengthFieldBasedFrameDecoder#decode(io.netty.channel.ChannelHandlerContext, io.netty.buffer.ByteBuf)

    2019-11-13
收起评论
看过的人还看
Java核心技术面试精讲

杨晓峰  前Oracle首席工程师

43讲 | 43483 人已学习

拼团 ¥79 原价 ¥99
MySQL实战45讲

林晓斌  网名丁奇,前阿里资深技术专家

48讲 | 43913 人已学习

拼团 ¥69 原价 ¥99
Java并发编程实战

王宝令  资深架构师

50讲 | 15433 人已学习

拼团 ¥69 原价 ¥99
深入拆解Tomcat & Jetty

李号双  eBay技术主管

44讲 | 6160 人已学习

¥99