netty使用什么协议,netty支持哪些通信协议
00-1010介绍本地传输协议对netty本地传输协议的依赖性
00-1010对于IO来说,除了传统的块IO,NIO是最常用的一种。通常,NIO是netty程序中最常用的一个,如NIOEVentloopgroup、NIOServerSocketChannel等。
我们也知道IO中有比NIO更快的IO方法,比如kqueue和epoll,但是这两种方法都需要原生方法的支持,也就是说需要在操作系统层面提供服务。
如果我们在支持Kqueue或者epoll的服务器上,netty能为这些优秀的IO提供支持吗?
答案是肯定的。但首先,kqueue和epoll需要JNI支持,这意味着JAVA程序需要调用本地原生方法。
00-1010为了使用kequeue和epoll这种原生传输方式,我们需要添加项目的依赖关系。如果是linux环境,可以添加以下maven依赖环境:
依赖项依赖项group idio . netty/groupId artifactId netty-transport-native-epoll/artifactId版本{ project . Version }/版本分类器Linux-x86 _ 64/分类器/依赖项./Dependencies,其中版本需要与您使用的netty版本号匹配,否则可能会出现异常调用。
分类器代表系统架构,其值可以是linux-x86_64或linux-aarch_64。
如果你用的是mac系统,那么你可以这样介绍:
依赖项依赖项group idio . netty/groupId artifactId netty-transport-native-k queue/artifactId Version { project . Version }/版本分类器OS X-x86 _ 64/分类器/依赖项./dependency inetty除了单个套餐,还有一个netty-all的all in one套餐。如果在一个包中使用这一切,就不需要添加native的依赖。
如果netty提供的系统架构不是你正在使用的,那么你需要手动编译。下面是编译所依赖的包。如果在RHEL/CentOS/Fedora系统中,使用:
sud yum install autoconf automake libtool make tar glibc-devel lib gcc . i686 glibc-devel . i686如果是在Debian/Ubuntu系统中,使用:
sud apt-get install autoconf automake libtool make tar gcc如果是在MacOS/BSD系统中,使用:
brew安装autoconf自动生成libtool
00-1010安装完依赖包后,我们可以在netty中使用这些原生传输协议。
原生传输协议的使用与NIO基本相同,我们只需要做如下替换。
如果在liunx系统中,请进行以下更换:
NioEventLoopGroupepolleventploopgroup NioEventLoopepolleventploop NioServerSocketChannelEpollServer
SocketChannel NioSocketChannel → EpollSocketChannel如果是在mac系统中,则进行下面的替换:
NioEventLoopGroup → KQueueEventLoopGroup NioEventLoop → KQueueEventLoop NioServerSocketChannel → KQueueServerSocketChannel NioSocketChannel → KQueueSocketChannel
这里还是使用我们熟悉的聊天服务为例,首先看下基于Kqueue的netty服务器端应该怎么写:
EventLoopGroup bossGroup = new KQueueEventLoopGroup(1); EventLoopGroup workerGroup = new KQueueEventLoopGroup(); try { ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup) .channel(KQueueServerSocketChannel.class) .handler(new LoggingHandler(LogLevel.INFO)) .childHandler(new NativeChatServerInitializer()); Channel channel = b.bind(PORT).sync().channel(); log.info("server channel:{}", channel); channel.closeFuture().sync();
和NIO一样,在服务器端我们需要使用KQueueEventLoopGroup创建两个EventLoopGroup,一个是bossGroup, 一个是workerGroup。
然后将这两个group传入到ServerBootstrap中,并且添加KQueueServerSocketChannel作为channel。
其他的内容和NIO server的内容是一样的。
接下来我们看下基于Kqueue的netty客户端改如何跟server端建立连接:
EventLoopGroup group = new KQueueEventLoopGroup(); try { Bootstrap b = new Bootstrap(); b.group(group) .channel(KQueueSocketChannel.class) .handler(new NativeChatClientInitializer()); // 建立连接 Channel ch = b.connect(HOST, PORT).sync().channel(); log.info("client channel: {}", ch);
这里使用的是KQueueEventLoopGroup,并将KQueueEventLoopGroup放到Bootstrap中,并且为Bootstrap提供了和server端一致的KQueueSocketChannel。
然后就是客户端向channel中写消息,这里我们直接从命令行输入:
// 从命令行输入 ChannelFuture lastWriteFuture = null; BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); for (;;) { String line = in.readLine(); if (line == null) { break; } // 将从命令行输入的一行字符写到channel中 lastWriteFuture = ch.writeAndFlush(line + "rn"); // 如果输入再见,则等待server端关闭channel if ("再见".equalsIgnoreCase(line)) { ch.closeFuture().sync(); break; } }
上面代码的意思是将命令行收到的消息写入到channel中,如果输入的是’再见’,则关闭channel。
为了能够处理字符串,这里用到了三个编码解码器:
// 添加行分割器 pipeline.addLast(new DelimiterBasedFrameDecoder(8192, Delimiters.lineDelimiter())); // 添加String Decoder和String Encoder,用来进行字符串的转换 pipeline.addLast(new StringEncoder()); pipeline.addLast(new StringDecoder());
分别是行分割器,字符编码器和字符解码器。
运行一下看,程序运行没问题,客户端和服务器端可以进行通讯。
总结
这里我们只以Kqueue为例介绍了netty中native传输协议的使用,具体的代码,大家可以参考:
learn-netty4
到此这篇关于在netty中使用native传输协议的文章就介绍到这了,更多相关native传输协议内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。