基本背景

Socket套接字

image.png
image.png
我们知道linux万物皆文件,每个文件有个文件标识符fd,我们可以想象linux提供给我们的socket fd就是操作系统将传输层及以下的协议进行封装抽象化的一个接口。
我们可以简单把socket理解成对应的一次tcp连接。

两种Socket套接字

Socket套接字有两种,一种是服务端用于监听端口连接请求的server socket,一种是用于数据通信的socket。
image.png
在Socket编程中,我们在服务端,使用server socket监听端口之后,开始不断Accept请求,一但有请求我们会通过Accept方法返回一个新的socket fd,用于读写。
那么我们得到这个fd,我们就需要处理这个socket,由于这个socket他可能包含读/写数据以及断开连接等等事件,所以如何管理就是关键。

阻塞IO(BIO)

BIO,API的设计会阻塞程序调用,直到返回,才继续执行程序。
程序会进入阻塞态,线程要恢复执行,需要先进入就绪态。线程的上下文切换比较耗时。

非阻塞IO(NIO)

API的设计不会阻塞程序调用,不用等调用返回,就直接往下继续执行程序。

异步IO(AIO)

image.png
在异步I/O中,readKey方法会直接返回,但是没有结果,结果需要一个回调函数 callBackFunction 去接收。

I/O多路复用技术

服务端程序或线程需要维护一个Socket集合,然后定期遍历这个集合image.png