代码流程
代码实现了一个基于Java NIO的C/S架构的简单聊天室,其中服务器端使用epoll模型,支持多个客户端连接,一个客户端发送消息,服务器会将消息转发到其他客户端并在其他客户端显示这条消息。
服务器端代码的实现流程如下:
创建Selector对象和ServerSocketChannel对象,并将ServerSocketChannel注册到Selector上,监听连接事件。
进入主循环,调用Selector的select()方法等待事件发生。
如果有事件发生,使用迭代器遍历SelectionKey集合,处理每个事件。
如果是连接事件,使用ServerSocketChannel的accept()方法接受客户端连接,并将客户端的SocketChannel注册到Selector上,监听读事件。
如果是读事件,使用SocketChannel的read()方法读取客户端发送的消息,并将其转发给其他客户端。
处理完事件后,使用迭代器的remove()方法将SelectionKey从集合中删除。
回到主循环,等待下一个事件。
客户端代码的实现流程如下:
创建SocketChannel对象,连接服务器。
如果连接未完成,等待连接完成。
读取用户输入的用户名,将其发送给服务器。
创建一个新线程,使用SocketChannel的read()方法读取服务器发送的消息,并在控制台上显示。
在主线程中,读取用户输入的消息,使用SocketChannel的write()方法将其发送给服务器。
服务器端代码的重点内容:
使用Selector模型实现了高效的I/O多路复用,支持同时处理多个客户端连接。
使用ByteBuffer缓冲区实现了高效的读写操作。
使用Map集合保存每个客户端的SocketChannel和用户名,实现了转发消息给其他客户端的功能。
使用迭代器遍历SelectionKey集合,处理每个事件,实现了高效的事件处理。
客户端代码的重点内容:
使用SocketChannel实现了非阻塞式的I/O操作。
使用ByteBuffer缓冲区实现了高效的读写操作。
使用Scanner读取用户输入的消息,实现了用户与服务器的交互。