Netty学习Flag

博主详述了Netty的学习历程,从NIO入门到深入研究Netty的使用,涵盖了TCP粘包/拆包解决方案、分隔符和定长解码器、HTTP和WebSocket协议开发,以及私有协议栈和ChannelPipeline的实现。通过实例代码和总结,展现了Netty在处理网络通信中的优势和实用性。
摘要由CSDN通过智能技术生成

Netty学习Flag

  1. 先把Netty权威指南看一遍,看完记录心得体会
  2. 再看Netty源码,贴出重要的源码与使用示例,总结

本打算边看书边敲代码边记笔记的,但是发现这样进度太慢,只好放弃记笔记,选择边看边敲代码,敲代码很有必要,有助于理解程序。

第二章 NIO入门

2019-03-31 已看完第二章,代码提交至码云:git@gitee.com:kevan807680925/netty-learning.git
branch:chapter2

总结

通过第二章的学习,了解了四种I/O模型,即BIO、伪异步I/O(非官方名词)、NIO、AIO,对比如下:
在这里插入图片描述
不选择JDK 原生NIO进行网络编程的原因:
(1)NIO的类库和API繁杂,使用麻烦,你需要熟练掌握Selector、ServerSocketChanneI、SocketChanneI、ByteBufTer等。
(2)需要貝备其他的额外技能做铺垫,例如熟悉Java多线程编程。这是因为NIO编程涉
及到Reactor模式,你必须对多线程和网路编程非常熟悉,才能编写出高质量的NIO程序。
(3)可靠性能力补齐,工作量和难度都非常人。例如客户端面临断连重连、网络闪断、
半包读写、失败缓存、网络拥塞和异常码流的处理等问题,NIO编程的特点是功能开发相
对容易,但是可靠性能力补齐的工作量和难度都非常大。
(4)JDK NIO的BUG,例如臭名昭著的epoll bug’它会导致Selector空轮询,最终导
致CPU100%。官方声称在JDK1.6版本的updatel8修复了该问题,但是直到JDK1.7版
本该问题仍旧存在,只不过该BUG发生概率降低了一些而己,它并没有得到根本性解决。

为什么选择Netty
Netty是业界最流行的NIO框架之一,它的健壮性、功能、性能、可定制性和可扩展
性在同类框架中都是首屈一指的,它己经得到成百上千的商用项目验证,例如Hadoop的
RPC框架Avro就使用了Netty作为底层通信框架,其他还有业界主流的RPC框架,也使
用Netty来构建高性能的异步通信能力。
通过对Netty的分析,我们将它的优点总结如下。

  • API使用简单,开发门槛低;
  • 功能强大,预置了多种编解码功能,支持多种主流协议;
  • 定制能力强,可以通过ChannelHandler对通信框架进行灵活地扩展:
  • 性能高,通过与其他业界主流的N℃框架对比,Netty的综合性能最优;
  • 成熟、稳定,Netty修复了已经发现的所有JDKNIOBUG,业务开发人员不需要 再为NIO的BUG而烦恼:
  • 社区活跃,版本迭代周期短,发现的BUG可以被及时修复,同时,更多的新功 能会加入;
  • 经历了大规模的商业应用考验,质量得到验证。Netty在互联网、大数据、网络
    游戏、企业应用、电信软件等众多行业己经得到了成功商用,证明它己经完全能 够满足不同行业的商业应用了。

正是因为这些优点,Netty逐渐成为了JavaNIO编程的首选框架。

第三章 Netty入门应用

2019-03-31 已看完第三章,代码提交至码云:git@gitee.com:kevan807680925/netty-learning.git
branch:chapter3

总结

第三章使用Netty对第二章的TimeServer进行了重构,可以发现代码更加的简洁、开发难度更低、扩展性也更好,非常适合作为基础通信框架被用户集成和使用。

第四章 TCP粘包/拆包问题的解决之道

2019-03-31 已看完第四章,代码提交至码云:git@gitee.com:kevan807680925/netty-learning.git
branch:chapter4
version1 是未考虑TCP粘包/拆包版本
version2 用LineBasedFrameDecoder + StringDecoder组合来解决TCP粘包/拆包问题

总结

本章首先对TCP的粘包和拆包进行了讲解,给出了解决这个问题的通用做法。然后我们对第3章的时间服务器进行改造和测试,首先验证没有考虑TCP粘包/拆包导致的问题。随后给出了解决方案,即利用LineBasedFrameDecoder+StrmgDecoder来解决TCP的粘包/拆包问题。
TCP粘包/拆包
TCP是个“流”协议,所谓流,就是没有界限的一串数据。大家可以想想河里的流水,
它们是连成一片的,其间并没有分界线。TCP底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为,一个完整的包可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的TCP粘包和拆包问题。

第五章 分隔符和定长解码器的应用

2019-03-31 已看完第五章,代码提交至码云:git@gitee.com:kevan807680925/netty-learning.git
branch:chapter5

总结

TCP以流的方式进行数据传输,上层的应用协议为了对消息进行区分,往往采用如下
4种方式。
(1)消息长度固定,累计读取到长度总和为定长LEN的报文后,就认为读取到了一个完整的消息:将计数器置位,重新开始读取下一个数据报:
(2)将回车换行符作为消息结束符,例如FTP协议,这种方式在文本协议中应用比较广泛;
(3)将特殊的分隔符作为消息的结束标志,回车换行符就是一种特殊的结束分隔符;
(4)通过在消息头中定义长度字段来标识消息的总长度。
Netty对上面4种应用做了统一的抽象,提供了4种解码器来解决对应的问题,使用起来非常方便。有了这些解码器,用户不需要自己对读取的报文进行人工解码,也不需要考虑TCP的粘包和拆包。

本章我们学习了两个非常实用的解码器:DelimiterBasedFrameDecoder和FixedLengthFrameDecoder。
DelimiterBasedFrameDecoder用于对使用分隔符结尾的消息进行自动解码,FixedLengthFrameDecoder用于对固定长度的消息进行自动解码。有了上述两种解码器,再结合其他的解码器,如字符串解码器等,可以轻松地完成对很多消息的自动解码,而且不再需要考虑TCP粘包/拆包导致的读半包问题,极大地提升了开发效率。
应用DeIimiterBasedFrameDecoder和FixedLengthFrameDecoder进行开发非常简单,
在绝大数情况下,只要将DeIimiterBasedFrameDecoder或FixedLengthFrameDecoder添加到对应ChannelPipeline的起始位即可。

telnet 使用技巧分享

  1. WIN+R输入cmd,打开DOS窗口;
  2. 输入telnet回车进入telenet操作界面;
  3. 输入help,查看支持的命令以及用法。

Eg:打开本地回显然后连接到本地8080端口
在这里插入图片描述
telnet默认关闭本地回显,当连接至服务器时,输入的内容是看不见的,所以有时候需要打开这个功能,让人能够明确感知输入的内容。

第六章 编解码技术

2019-03-31 已看完第六章,无代码示例。

总结

Java序列号的缺点:

  • 无法跨语言
  • 序列化后的码流太大
  • 序列化性能太低

业界主流的三种编解码框架:

  • Google的Protobuf
  • Facebook的Thrift
  • JBoss的Marshalling

第七章 MessagePack编解码

2019-04-01 已看完第七章,代码提交至码云:git@gitee.com:kevan807680925/netty-learning.git
branch:chapter7

总结

MessagePack是一个高效的二进制序列化框架,它像JSON一样支持不同语言间的数
据交换,但是它的性能更快,序列化之后的码流也更小。
本章首先对MessagePack序列化框架进行了讲解,然后利用Netty提供的编解码框架扩展实现了对MessagePack编解码的支持。
最后结合Netty提供的半包编码和解码器,MessagePack编解码框架实现了对TCP粘包和半包的支持。后续章节,我们还将专门对LengthFieldPrepender和
LengthFieldBasedFrameDecoder的工作原理进行详细讲解。

第八章 Google Protobuf编解码

2019-04-01 已看完第八章,代码提交至码云:git@gitee.com:kevan807680925/netty-learning.git
branch:chapter8

总结

Protobuf是一个灵活、高效、结构化的数据序列化框架,相比于XML等传统的序列化工具,它史小、更快、史简单。Protobuf支持数据结构化一次可以到处使用,甚至跨语言使用,通过代码生成工具可以自动生成不同语言版本的源代码,甚至可以在使用不同版本的数据结构进程间进行数据传递,实现数据结构的前向兼容。

ProtobufDecoder仅仅负责解码,它不支持读半包。因此,在ProtobufDecoder前面,一定要有能够处理读半包的解码器,有以下三种方式可以选择。
1)使用Netty提供的ProtobufVarint32FrameDecoder,它可以处理半包消息;
2)继承Netty提供的通用半包解码器LengthFieldBasedFrameDecoder;
3)继承ByteToMessageDecoder类,自己处理半包消息。

本章首先介绍了protobuf的入门知识,通过一个简单的样例代码开发让读者熟悉了如何使用Protobuf对POJO对象进行编解码:在掌握了Protobuf的基础知识后,讲解如何使用Netty的Protobuf编解码框架进行客户端和服务端的开发;最后,对Protobuf解码器的使用陷阱进行了说明,并给出了正确的使用建议。

第九章 JBoss Marshalling编解码

2019-04-01 已看完第九章,代码提交至码云:git@gitee.com:kevan807680925/netty-learning.git
branch:chapter9

总结

JBossMarshalling是一个Java对象序列化包,对JDK默认的序列化框架进行了优化,但又保持跟java.io.Serializable接口的兼容,同时增加了一些可调的参数和附加的特性,这些参数和特性可通过工厂类进行配置。

本章介绍了如何使用Netty的Marshalling编码器和解码器对POJO对象进行序列化。通过使用Netty的Marshalling编解码器,我们可以轻松地开发出支持JBossMarshalling序列化的客户端和服务端程序,方便地对接JBoss的内部模块,同时也有利于对己有使用JbossMarshalling框架做通信协议的模块的桥接和重用。

第十章 HTTP协议开发应用

2019-04-13 看完第十章,代码提交至码云:git@gitee.com:kevan807680925/netty-learning.git
branch:chapter10

概要

HTTP(超文本传输协议)协议是建立在TCP传输协议之上的应用层协议,它的发展是万维网协会和ln

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值