简介
在前面的章节中,我们讲解了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接