本篇博客主要是讲一些基础,记录我的学习过程,同时尝试养成写博客的习惯。内容基本来自Netty权威指南。。。。
I/O基础入门
在jdk1.4以前,java对i/o的支持并不完善,开发人员在开发高性能i/o时会遇到巨大的挑战与困难,主要问题如下:
- 没有数据缓存区,i/o性能存在问题
- 没有c或c++中Channel概念,只有输入输出流
- 同步阻塞I/O(BIO)会导致通信线程长时间阻塞
- 支持的字符集有限,硬件移植能力差
在java支持异步i/o之前,高性能服务端开发领域一直被c和c++占据,java同步i/o一直
被大家所诟病。
Linux网络I/O模型简介
linux将所有外部设备都看成文件来操作,无论是对文件还是套接字(socket)的读写都会返回一个描述符(指向内核中的一个结构体,结构体包括文件路径,数据区等属性)。应用程序要为因特网通信而创建一个套接字(socket)时,操作系统就返回一个小整数作为描述符(descriptor)来标识这个套接字。然后,应用程序以该描述符作为传递参数,通过调用函数来完成某种操作(例如通过网络传送数据或接收输入的数据)。
当应用程序要创建一个套接字时,操作系统就返回一个小整数作为描述符,应用程序则使用这个描述符来引用该套接字,然后需要I/O请求的应用程序请求操作系统打开一个文件。操作系统就创建一个文件描述符提供给应用程序访问文件。从应用程序的角度看,文件描述符是一个整