Netty权威指南(第2版) - (EPUB全文下载)
文件大小:0.37 mb。
文件格式:epub 格式。
书籍内容:
Netty权威指南(第2版)
基础篇 走进Java NIO
第2章 NIO入门
入门篇 Netty NIO开发指南
第4章 TCP粘包/拆包问题的解决之道
第5章 分隔符和定长解码器的应用
中级篇 Netty编解码开发指南
第7章 MessagePack编解码
第8章 Google Protobuf编解码
第9章 JBoss Marshalling编解码
高级篇 Netty多协议开发和应用
第11章 WebSocket协议开发
第12章 私有协议栈开发
第13章 服务端创建
第14章 客户端创建
源码分析篇 Netty功能介绍和源码分析
第16章 Channel和Unsafe
第17章 ChannelPipeline和ChannelHandler
第18章 EventLoop和EventLoopGroup
第19章 Future和Promise
架构和行业应用篇 Netty高级特性
第21章 Java多线程编程在Netty中的应用
第22章 高性能之道
第23章 可靠性
第24章 安全性
第25章 Netty未来展望
附录A Netty参数配置表
基础篇 走进Java NIO
第1章 Java的I/O演进之路
Java是由Sun Microsystems公司在1995年首先发布的编程语言和计算平台。这项基础技术支持最新的程序,包括实用程序、游戏和业务应用程序。Java在世界各地的8.5亿多台个人计算机和数十亿套设备上运行着,其中包括移动设备和电视设备。
Java之所以能够得到如此广泛的应用,除了摆脱硬件平台的依赖具有”一次编写、到处运行”的平台无关性特性之外,另一个重要原因是:其丰富而强大的类库以及众多第三方开源类库使得基于Java语言的开发更加简单和便捷。
但是,对于一些经验丰富的程序员来说,Java的一些类库在早期设计中功能并不完善或者存在一些缺陷,其中最令人恼火的就是基于同步I/O的Socket通信类库。直到2002年2月13日JDK1.4 Merlin的发布,Java才第一次支持非阻塞I/O,这个类库的提供为JDK的通信模型带来了翻天覆地的变化。
在开始学习Netty之前,我们首先对UNIX系统常用的I/O模型进行介绍,然后对Java的I/O历史演进进行简单说明。通过本章节的学习,希望读者对同步和异步I/O以及Java的I/O类库发展有个直观的了解,方便后续章节的学习。如果你已经熟练NIO编程或者从事过UNIX网络编程,希望直接学习Java的NIO和Netty,那就可以直接跳到第2章进行学习。
本章主要内容包括:
◎ I/O基础入门
◎ Java的I/O演进
1.1 I/O基础入门
Java1.4之前的早期版本,Java对I/O的支持并不完善,开发人员在开发高性能I/O程序的时候,会面临一些巨大的挑战和困难,主要问题如下。
◎ 没有数据缓冲区,I/O性能存在问题;
◎ 没有C或者C++中的Channel概念,只有输入和输出流;
◎ 同步阻塞式I/O通信(BIO),通常会导致通信线程被长时间阻塞;◎ 支持的字符集有限,硬件可移植性不好。
在Java支持异步I/O之前的很长一段时间里,高性能服务端开发领域一直被C++和C长期占据,Java的同步阻塞I/O被大家所诟病。
1.1.1 Linux网络I/O模型简介
Linux的内核将所有外部设备都看做一个文件来操作,对一个文件的读写操作会调用内核提供的系统命令,返回一个file descriptor(fd,文件描述符)。而对一个socket的读写也会有相应的描述符,称为socketfd(socket描述符),描述符就是一个数字,它指向内核中的一个结构体(文件路径,数据区等一些属性)。
根据UNIX网络编程对I/O模型的分类,UNIX提供了5种I/O模型,分别如下。
(1)阻塞I/O模型:最常用的I/O模型就是阻塞I/O模型,缺省情形下,所有文件操作都是阻塞的。我们以套接字接口为例来讲解此模型:在进程空间中调用recvfrom,其系统调用直到数据包到达且被复制到应用进程的缓冲区中或者发生错误时才返回,在此期间一直会等待,进程在从调用recvfrom开始到它返回的整段时间内都是被阻塞的,因此被称为阻塞I/O模型,如图1-1所示。
(2)非阻塞I/O模型:recvfrom从应用层到内核的时候,如果该缓冲区没有数据的话,就直接返回一个EWOULDBLOCK错误,一般都对非阻塞I/O模型进行轮询检查这个状态,看内核是不是有数据到来,如图1-2所示。
图1-1 阻塞I/O模型
图1-2 非阻塞I/O模型
(3)I/O复用模型:Linux提供select/poll,进程通过将一个或多个fd传递给select或poll系统调用,阻塞在select操作上,这样select/poll可以帮我们侦测多个fd是否处于就绪状态。select/poll是顺序扫描fd是否就绪,而且支持的fd数量有限,因此它的使用受到了一些制约。Linux还提供了一个epoll系统调用,epoll使用基于事件驱动方式代替顺序扫描,因此性能更高。当有fd就绪时,立即回调函数rollback,如图1-3所示。
(4)信号驱动I/O模型:首先开启套接口信号驱动I/O功能,并通过系统调用sigaction执行一个信号处理函数(此系统调用立即返回,进程继续工作,它是非阻塞的)。当数据准备就绪时,就为该进程生成一个SIGIO信号,通过信号回调通知应用程序调用recvfrom来读取数据,并通知主循环函数处理数据,如图1-4所示。
图1-3 I/O复用模型
图1-4 信号驱动I/O模型
(5)异步I/O:告知内核启动某个操作,并让内核在整个操作完成后(包括将数据从内核复制到用户自己的缓冲区)通知我们。这种模型与信号驱动模型的主要区别是:信号驱动I/O由内核通知我们何时可以开始一个I/O操作;异步I/O模型由内核通知我们I/O操作何时已经完成,如图1-5所示。
如果想要了解更多的UNIX系统网络编程知识,可以阅读《UNIX ............
以上为书籍内容预览,如需阅读全文内容请下载EPUB源文件,祝您阅读愉快。
书云 Open E-Library » Netty权威指南(第2版) - (EPUB全文下载)