简介
在前面的章节中,我们讲解了kqueue的使用和原理,接下来我们再看一下epoll的使用。两者都是更加高级的IO方式,都需要借助native的方法实现,不同的是Kqueue用在mac系统中,而epoll用在liunx系统中。
epoll的详细使用
epoll的使用也很简单,我们还是以常用的聊天室为例来讲解epoll的使用。
对于server端来说需要创建bossGroup和workerGroup,在NIO中这两个group是NIOEventLoopGroup,在epoll中则需要使用EpollEventLoopGroup:
EventLoopGroup bossGroup = new EpollEventLoopGroup(1);EventLoopGroup workerGroup = new EpollEventLoopGroup();
接着需要将bossGroup和workerGroup传入到ServerBootstrap中:
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup).channel(EpollServerSocketChannel.class).handler(new LoggingHandler(LogLevel.INFO)).childHandler(new NativeChatServerInitializer());
注意,这里传入的channel是EpollServerSocketChannel,专门用来处理epoll的请求。其他的部分和普通的NIO服务是一样的。
接下来看下epoll的客户端,对于客户端来说需要创建一个EventLoopGroup,这里使用的是EpollEventLoopGroup:
EventLoopGroup group = new EpollEventLoopGroup();
然后将这个group传入Bootstrap中去:
Bootstrap b = new Bootstrap();b.group(group).channel(EpollSocketChannel.class).handler(new NativeChatClientInitializer());
这里使用的channel是EpollSocketChannel,是和EpollServerSocketChannel对应的客户端的channel。
EpollEventLoopGroup
先看下EpollEventLoopGroup的定义:
public final class EpollEventLoopGroup extends MultithreadEventLoopGroup
和KqueueEventLoopGroup一样,EpollEventLoopGroup也是继承自MultithreadEventLoopGroup,表示它可以开启多个线程。
在使用EpollEventLoopGroup之前,需要确保epoll相关的JNI接口都已经准备完毕:
Epoll.en