本章节包括:
1)OIO-------阻塞IO传输服务
2)NIO-------异步IO传输服务
3)本地传输服务-----在JVM内异步的通信
4)嵌入式传输服务------测试你的ChannelHandlers
注:本章分成四部分翻译
1:传输服务迁移案例分析
2:传输协议的API
3:Netty包含的传输服务
4:传输使用案例
========================分割线==========================
在网络传输中数据通常就以一种格式去传输:字节,这些字节在网络上的行为绝大部分取决你我们指定的网络传输类型,正是因为网络服务的理论可以使我们的应用从网络传输的底层机制中抽象出来,使用者并不关心底层的实现细节,他们只想他们的数据字节能够稳定地发送和接收
如果你有过Java网络编程的经验,那么你在开发网络应用程序的时候,往往会发现有时候你需要支持比预期更多的并发连接数,如果你尝试为了支持更多的并发,将阻塞传输切换成非阻塞传输,你可能会遇到一些麻烦,因为这两种传输类型的实现是很不一样的
但是如果使用Netty就会变得不一样了,Netty提供了统一的API给用户使用,从而隐藏了它底层具体的传输服务实现,通过这种转化会比你直接使用JDK的原生API更加方便
你会发现你的代码不会应该传输服务类型的改变而受到大幅度的影响,你不需要大篇幅地重构你的代码,简而言之,使用Netty之后,你只需要花更多的时间专注于你的网络业务逻辑的处理
在这个章节,我们将学习一些比较常见的Netty的API,你可以将其与JDK的API做比较,你会发现Netty的更加易于使用,然后我们会逐一地解释与Netty天生绑定在一起的传输服务,并且使用案例来理解和合理的使用这些传输服务,当你掌握了这些技巧,你会在平时的开发中,很快的选择出最适合你应用的网络传输服务供你使用
学习本章节的一些准备知识包括java语言,如果你有网络编程经验就更加好了,当然这并不是必要的
我们通过一个真实的案例开始学习我们的网络服务是如何工作的
4.1 Case study: transport migration
我们以一个简单的应用案例的例子来开始我们传输服务的学习,这个例子很简单,服务端接收连接,发送一个“Hi”到客户端,然后关闭连接
4.1.1 Using OIO and NIO without Netty
我们向你展示如何在只使用JDK的原生API写阻塞和非阻塞的应用,下一个代码清单向你展示了阻塞模式的实现,如果你以前有过这方面的代码编程经历,也许下面的代码会唤起你的一些美好的回忆
这段代码块可以处理一定的并发量的客户端连接,但是随着时间的推移,你的应用的普及,你将意识到这种阻塞设计是不能抗住万级的并发量的,所以你打算将其转化成异步的传输服务,但是经过调查发现,异步的API与同步的相差很多,所以你不得不重写你的应用
非阻塞的版本的代码清单如下
你可以观察到,这段代码块与前面的阻塞模型的代码块完成的功能是一样的,但是代码却截然不同,如果写一个这么简单的应用都需要你对你的应用完全重写,你可以想象在真实的情况下也许会变得更加复杂
好了,我们可以看看Netty是如何实现阻塞到非阻塞的转化的吧
4.1.2 Using OIO and NIO with Netty
我们开始用Netty写一个阻塞模式版本的应用吧,代码清单如下
我们再来看看Netty的非阻塞的版本吧
4.1.3 Non-blocking Netty version
注意下面的代码清单中我们用高亮的黑体标注出与代码清单4.3中不同的地方,其实只需要将OIO转化成NIO就一切ok了
因为Netty为每一个传输服务类型都提供了相同的实现,不管你选择什么,你的业务主体代码都不会受影响,传输服务的不同实现都定义在接口Channel,ChannelPipeline,ChannelHandler
你已经预览了基于Netty的程序所获得的好处了,让我们更加近距离的探究一下传输API本身吧