Java对多路复用I/O技术的支持

Java对多路复用I/O技术的支持

一、重要概念:Channel
    Channel通道,是一个用来完成应用程序和操作系统交互事件、传递内容的渠道,注意是连接到操作系统。一个通道会有一个专属的文件状态描述符。既然是和操作系统进行内容的传递,那就说明应用程序可以通过通道从操作系统读取数据,也可以通过通道向操作系统写数据。
    所有被Selector(选择器)注册的通道,只能是继承了SelectableChannel类的子类。其中有几个关键的Channel通道实现,需要进行说明。
    1、ServerSocketChannel:应用服务器端的监听通道。只有通过这个通道,应用程序才能向操作系统注册支持“多路复用I/O”的端口监听。它同时支持UDP协议和TCP协议。
    2、SocketChannel:TCP Socket套接字的监听通道,一个Socket套接字对应了一个客户端(IP和端口)到服务器端(IP和端口)的通信连接。
    3、DatagramChannel:UDP数据报文的监听通道。
二、重要概念:Buffer
    数据缓存区:在Java原生NIO框架中,为了保证每个通道的数据通道读/写速度,Java NIO框架为每一种需要支持数据读/写的通道集成了Buffer的支持。例如:ServerSocketChannel通道只支持OP_ACCEPT事件的监听,它是不能直接进行网络数据内容的读/写的,所以ServerSocketChannel是没有集成Buffer的。
    Buffer有两种工作模式:写模式和读模式。在读模式下,应用程序只能从Buffer中读取数据,不能进行写操作。但是在写模式下,应用程序是可以进行读操作的,这就表示可能会出现脏读的情况。所以一旦决定要从Buffer中读取数据,就一定要将Buffer的状态改为读模式。
    1.position:缓存区目前正在操作的数据块位置。
    2.limit:缓存区最大可以进行操作的位置。缓存区的读/写状态正是由这个属性控制的。
    3.capacity:缓存区的最大容量。这个容量实在缓存区创建时进行制定的。由于高并发时通道数量往往会很庞大,所以每一个缓存区的容量最好不要过大。
三、重要概念:Selector
    1.事件订阅和Channel管理:应用程序将向Selector对象注册需要它关注的Channel,以及具体的某一个Channel会对哪些I/O事件感兴趣。Selector中也会维护一个“已经注册的Channel”的容器。
    2.轮询代理:应用层不再通过阻塞模式或者非阻塞模式直接询问操作系统“事件有没有发生”,而是由Selector代其询问。
    3.实现不同操作系统的支持:多路复用I/O技术是需要操作系统进行支持的,其特点就是操作系统可以同时扫描同一个端口的多个网络连接。所以作为上层的JVM,必须要为不同操作系统的多路复用I/O实现编写不同的代码。

猜你喜欢

转载自blog.csdn.net/qq_22238629/article/details/77979797