介绍对于IO来说,除了传统的blockIO之外,NIO是用的最多的一种。通常,NIO是netty程序中最常用的,比如NioEventLoopGroup、NioServerSocketChannel等。我们也知道在IO中还有比NIO更快的IO方法,比如kqueue和epoll,但这两种方法需要native方法的支持,也就是说需要在操作系统层面提供服务。如果我们在一个支持Kqueue或者epoll的服务器上,netty可以提供对这些优秀IO的支持吗?答案是肯定的。但是首先kqueue和epoll需要JNI的支持,也就是说JAVA程序需要调用本地的native方法。原生传输协议的依赖要使用kequeue、epoll等原生传输方式,我们需要添加额外的项目依赖。如果是linux环境,可以添加如下maven依赖环境:io.nettynetty-transport-native-epoll${project.version}linux-x86_64...其中version需要和你使用的netty版本号匹配,否则可能会调用例外。分类器代表系统架构,它的值可以是linux-x86_64或linux-aarch_64。如果你使用的是mac系统,你可以这样导入:.version}osx-x86_64...netty除了个别单独的包,还有一个netty-all包。如果您在一个包中使用所有这些,则不需要添加额外的本机依赖项。如果netty提供的系统架构不是你使用的,那么你需要手动编译。以下是编译依赖的包。如果是RHEL/CentOS/Fedora系统,使用:sudoyuminstallautoconfautomakelibtoolmaketar\glibc-devel\libgcc.i686glibc-devel.i686如果是Debian/Ubuntu系统,使用:sudoapt-getinstallautoconfautomakelibtoolmaketar\gcc如果是MacOS/BSD系统,使用:brewinstallautoconfautomakelibtoolnetty使用本地传输协议安装好依赖包后,我们就可以在netty中使用这些本地传输协议了。原生传输协议的使用与NIO基本相同,我们只需要进行如下替换即可。如果是在liunx系统中,则进行下面的替换:NioEventLoopGroup→EpollEventLoopGroupNioEventLoop→EpollEventLoopNioServerSocketChannel→EpollServerSocketChannelNioSocketChannel→EpollSocketChannel如果是在mac系统中,则进行下面的替换:NioEventLoopGroup→KQueueEventLoopGroupNioEventLoop→KQueueEventLoopNioServerSocketChannel→KQueueServerSocketChannelNioSocketChannel→KQueueSocketChannelHerewestillusethechatservicewearefamiliarwithasanexample.First,let’slookathowtowritethenettyserverbasedonKqueue:EventLoopGroupbossGroup=newKQueueEventLoopGroup(1);EventLoopGroupworkerGroup=newKQueueEventLoopGroup();try{ServerBootstrapb=newServerBootstrap();b.group(bossGroup,workerGroup).channel(KQueueServerSocketChannel.class).handler(newLoggingHandler(LogLevel.INFO)).childHandler(newNativeChatServerInitializer());Channelchannel=b.bind(PORT).sync().channel();log.info("serverchannel:{}",channel);channel.closeFuture().sync();和NIO一样,在server端我们需要使用KQueueEventLoopGroup创建两个EventLoopGroup,一个是bossGroup,一个是workerGroup,然后将这两个组传入ServerBootstrap,并添加KQueueServerSocketChannel作为通道。其他内容同NIOserver。接下来我们看看基于Kqueue的netty客户端是如何与服务端建立连接的:EventLoopGroupgroup=newKQueueEventLoopGroup();试试{Bootstrapb=newBootstrap();b.group(group).channel(KQueueSocketChannel.class).handler(newNativeChatClientInitializer());//建立连接Channelch=b.connect(HOST,PORT).sync().channel();log.info("客户端通道:{}",ch);这里用到的最重要的是KQueueEventLoopGroup,把KQueueEventLoopGroup放到Bootstrap中,为Bootstrap提供和server端一样的KQueueSocketChannel。然后客户端向通道写入消息,这里我们直接在命令行输入://inputChannelFuturefromthecommandlinelastWriteFuture=null;BufferedReaderin=newBufferedReader(newInputStreamReader(System.in));对于(;;){字符串行=in.readLine();如果(行==空){中断;}//将命令行输入的一行字符写入通道lastWriteFuture=ch.writeAndFlush(line+"\r\n");//如果输入'goodbye',等待服务器关闭通道if("goodbye".equalsIgnoreCase(line)){ch.closeFuture().sync();休息;}}上面代码的意思是接收命令行消息写入通道,如果输入是'goodbye',则关闭通道。为了能够处理字符串,这里使用了三个编解码器://添加一个分行器pipeline.addLast(newDelimiterBasedFrameDecoder(8192,Delimiters.lineDelimiter()));//为字符串转换添加字符串解码器和字符串编码器pipeline.addLast(newStringEncoder());pipeline.addLast(newStringDecoder());分别是行分隔符、字符编码器和字符解码器。运行一下,看到程序运行正常,客户端和服务端可以通信了。总结这里我们只以Kqueue为例,介绍netty中原生传输协议的使用。具体代码可以参考:learn-netty4更多内容请参考http://www.flydean.com/52-netty-native-transport-md/最通俗的解读,最深刻的干货,最简洁的教程,很多你不知道的小技巧等你来发现!欢迎关注我的公众号:《程序那些事儿》,懂技术,更懂你!