下载APP
登录
关闭
讲堂
算法训练营
Python 进阶训练营
企业服务
极客商城
客户端下载
兑换中心
渠道合作
推荐作者
当前播放: 12 | TCP粘包/半包Netty全搞定
00:00 / 00:00
标清
  • 标清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看

Netty源码剖析与实战

共60讲 · 约670分钟
4385
免费
01 | 课程介绍
免费
02 | 内容综述
免费
03 | 揭开Netty面纱
免费
04 | 为什么舍近求远:不直接用...
免费
05 | 为什么孤注一掷:独选Nett...
06 | Netty的前尘往事
07 | Netty的现状与趋势
08 | Netty怎么切换三种I/O模...
09 | 源码剖析:Netty对I/O模...
10 | Netty如何支持三种Reacto...
11 | 源码剖析:Netty对Reacto...
12 | TCP粘包/半包Netty全搞...
13 | 源码剖析:Netty对处理粘...
14 | 常用的“二次”编解码方式
15 | 源码剖析:Netty对常用编...
16 | keepalive与idle监测
17 | 源码剖析:Netty对keepal...
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 | 优化使用:为不同平台开启...
48 | 安全增强:设置“高低水位...
49 | 安全增强:启用空闲监测
50 | 安全增强:简单有效的黑白...
51 | 安全增强:少不了的自定义...
52 | 安全增强:拿来即用的SSL...
53 | 安全增强:拿来即用的SSL...
54 | 安全增强:拿来即用的SSL...
55 | Cassandra如何使用Netty...
56 | Dubbo如何使用Netty ?
57 | Hadoop如何使用Netty ?
58 | 赏析Netty之美
59 | 如何给Netty贡献代码?
60 | 课程回顾与总结
本节摘要

精选留言(10)

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

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

    3
  • 2019-10-16
    学习不是短时间的冲刺,而是有节制的坚持

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

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

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

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

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

    1
  • 2019-11-13
    半包的原因:发的数据太大装不下了。。。
    我感觉粘包和半包就是类似于平常的断点续传。。。。

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

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

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

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

  • 2019-10-28
    老师的“hold 不住了”总结的太精辟了👍😄
  • 2019-10-24
    推荐+的这种方式,没有很理解,能举例说明下吗?

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

    1
  • 2019-10-19
    老师,我看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-16
    老师可以说一些学习netty之前要系统的学习哪些相关知识吗,因为平常工作中接触不到这方面的

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