在Java中,NIO(New I/O)提供了一种基于通道(Channel)和选择器(Selector)的非阻塞I/O处理方式。今天,我们将基于Java NIO的基本概念,来解析一个简单的手写服务器逻辑。
一、服务器初始化
首先,我们创建一个ServerSocketChannel
来监听传入的连接,并绑定到一个特定的IP地址和端口上。接着,我们将这个通道设置为非阻塞模式,以便在没有可用连接时,线程不会被阻塞。
二、创建Selector
然后,我们创建一个Selector
对象(管理者)来监视多个通道上的I/O就绪状态。我们将ServerSocketChannel
注册到Selector
上,并指定我们关心的事件是新的连接请求(OP_ACCEPT)可以将Selector当着分拣员,将将对应标号的商品进行分拣归类。
三、事件循环
我们进入事件循环,在这个循环中,我们调用selector.select()
方法来阻塞等待,直到至少有一个通道就绪。然后,我们遍历selectedKeys()
集合,处理每个就绪的通道。
四、处理ACCEPT、READ事件
当Selector
检测到ServerSocketChannel
上有新的连接请求时,我们接受这个连接,并将新的SocketChannel
也设置为非阻塞模式,然后将其注册到Selector
上,关心数据可读(OP_READ
)事件。当然有别的事件也可以进行添加。
以上就是一个基于Java NIO的手写服务器逻辑的基本框架。虽然这个示例很简单,但它展示了NIO的核心概念:通道、选择器和事件驱动。以此为基础,将核心概念掌握再拓展,比如跨域问题,如何让服务器更加稳定等等。