Hutool实现 非阻塞IO Server服务器
时间: 2023-12-06 17:02:52 浏览: 31
Hutool是一个Java工具包,其中包含了很多常用的工具类和功能。Hutool也提供了一些网络相关的工具类,可以用来实现非阻塞IO Server服务器。
以下是一个简单的使用Hutool实现非阻塞IO Server服务器的示例代码:
```java
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.log.StaticLog;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
public class NonBlockingServer {
public static void main(String[] args) throws IOException {
Selector selector = Selector.open();
ServerSocketChannel serverSocket = ServerSocketChannel.open();
serverSocket.bind(new InetSocketAddress(8080));
serverSocket.configureBlocking(false);
serverSocket.register(selector, SelectionKey.OP_ACCEPT);
while (true) {
if (selector.select() == 0) {
continue;
}
Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();
while (iterator.hasNext()) {
SelectionKey key = iterator.next();
iterator.remove();
if (key.isAcceptable()) {
ServerSocketChannel server = (ServerSocketChannel) key.channel();
SocketChannel socket = server.accept();
socket.configureBlocking(false);
socket.register(selector, SelectionKey.OP_READ);
StaticLog.info("新客户端连接:{}", socket.getRemoteAddress());
} else if (key.isReadable()) {
SocketChannel socket = (SocketChannel) key.channel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
int read = socket.read(buffer);
if (read > 0) {
String msg = StrUtil.utf8Str(buffer.array(), 0, read);
StaticLog.info("收到客户端消息:{}", msg);
} else if (read < 0) {
StaticLog.info("客户端断开连接:{}", socket.getRemoteAddress());
key.cancel();
IoUtil.close(socket);
}
}
}
}
}
}
```
该示例代码中,使用了Java NIO的非阻塞IO方式,通过Hutool提供的工具类进行IO操作。主要步骤如下:
1. 创建Selector对象和ServerSocketChannel对象,并将ServerSocketChannel注册到Selector中,监听OP_ACCEPT事件。
2. 进入循环,使用Selector的select()方法等待事件就绪。
3. 遍历已经就绪的事件,并根据事件类型执行相应的操作。其中,如果事件类型是OP_ACCEPT,则新建一个SocketChannel对象,并将它注册到Selector中,监听OP_READ事件;如果事件类型是OP_READ,则读取客户端发送的数据,并输出到控制台。
4. 返回第2步,继续等待事件就绪。
需要注意的是,在使用非阻塞IO方式时,要注意处理事件就绪时的异常情况,以及在操作完成后要及时关闭相关的资源。