问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

netty系列之:在netty中使用native传输协议

发布网友 发布时间:2024-10-19 12:14

我来回答

1个回答

热心网友 时间:2024-11-01 06:38

简介

对于IO来说,除了传统的block IO,使用最多的就是NIO了,通常我们在Netty程序中最常用到的就是NIO,比如NioEventLoopGroup,NioServerSocketChannel等。

我们也知道在IO中有比NIO更快的IO方式,比如kqueue和epoll,但是这两种方式需要native方法的支持,也就是说需要在操作系统层面提供服务。

如果我们在支持Kqueue或者epoll的服务器上,netty是否可以提供对这些优秀IO的支持呢?

答案是肯定的。但是首先kqueue和epoll需要JNI支持,也就是说JAVA程序需要调用本地的native方法。

native传输协议的依赖

要想使用kequeue和epoll这种native的传输方式,我们需要额外添加项目的依赖,如果是linux环境,则可以添加如下的maven依赖环境:

<dependencies><dependency><groupId>io.netty</groupId><artifactId>netty-transport-native-epoll</artifactId><version>${project.version}</version><classifier>linux-x86_64</classifier></dependency>...</dependencies>

其中version需要匹配你所使用的netty版本号,否则可能出现调用异常的情况。

classifier表示的是系统架构,它的值可以是linux-x86_64,也可以是linux-aarch_64.

如果你使用的mac系统,那么可以这样引入:

<dependencies><dependency><groupId>io.netty</groupId><artifactId>netty-transport-native-kqueue</artifactId><version>${project.version}</version><classifier>osx-x86_64</classifier></dependency>...</dependencies>

netty除了单独的个体包之外,还有一个all in one的netty-all包,如果你使用了这个all in one的包,那么不需要额外添加native的依赖。

如果netty提供的系统架构并没有你正在使用的,那么你需要手动进行编译,以下是编译所依赖的程序包, 如果是在RHEL/CentOS/Fedora系统中,则使用:

sudo yum install autoconf automake libtool make tar \ glibc-devel \ libgcc.i686 glibc-devel.i686

如果是在Debian/Ubuntu系统中,则使用:

sudo apt-get install autoconf automake libtool make tar \ gcc

如果是在MacOS/BSD系统中,则使用:

brew install autoconf automake libtoolnetty本地传输协议的使用

安装好依赖包之后,我们就可以在netty中使用这些native传输协议了。

native传输协议的使用和NIO的使用基本一致,我们只需要进行下面的替换即可。

如果是在liunx系统中,则进行下面的替换:

NioEventLoopGroup → EpollEventLoopGroupNioEventLoop → EpollEventLoopNioServerSocketChannel → EpollServerSocketChannelNioSocketChannel → EpollSocketChannel

如果是在mac系统中,则进行下面的替换:

NioEventLoopGroup → KQueueEventLoopGroupNioEventLoop → KQueueEventLoopNioServerSocketChannel → KQueueServerSocketChannelNioSocketChannel → 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 + "\r\n");// 如果输入'再见',则等待server端关闭channelif ("再见".equalsIgnoreCase(line)) {ch.closeFuture().sync();break;}}

上面代码的意思是将命令行收到的消息写入到channel中,如果输入的是’再见’,则关闭channel。

为了能够处理字符串,这里用到了三个编码解码器:

<dependencies><dependency><groupId>io.netty</groupId><artifactId>netty-transport-native-kqueue</artifactId><version>${project.version}</version><classifier>osx-x86_64</classifier></dependency>...</dependencies>0

分别是行分割器,字符编码器和字符解码器。

运行一下看,程序运行没问题,客户端和服务器端可以进行通讯。

总结

这里我们只以Kqueue为例介绍了netty中native传输协议的使用,具体的代码,大家可以参考:

learn-netty4

更多内容请参考?http://www.flydean.com/52-netty-native-transport-md/

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

原文:https://juejin.cn/post/7101610658185084936
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
神经再造综合疗法概述 能拍4k60帧的3d相机 索尼a7r5拍4k60帧有裁切吗 BNT脑神经递质导融激活疗法疗法原理 BNT脑神经递质导融激活疗法疗法的六大特点 BN脑神经平衡介入疗法效果怎? ...事件要有时间在叙述一两句,就O了,寒假作业要交的 2011年天津各大高职院校 寒假的开学时间是什么时候 有一个就回答一个... [综恐]这什么鬼东西!/what the fuck ! 89 综恐 这什么鬼东西80 ...之第4章 Reactor Netty针对EventLoopGroup的封装 ...Netty中线程模型源码讲解-续集EventLoopGroup和EventLoop【全网最... 怎么才能让我的嘴馋改改 本人乒乓球业余爱好者,应该算发烧的把。右手横拍,弧圈快攻打法,反手... 本人打乒乓球用横拍想配一块板,请高人指点 各位乒乓球大侠,请帮我选择横拍快攻加弧圈的球拍,正手拉弧圈为主_百... 是传闻中的七公主,一汉年士兵在在酒吧里见面的那个画面,唱的那首歌! ...电影&lt;&lt;阿甘正传&gt;&gt;里那个叫珍妮的女孩在酒吧里唱的那首歌叫什么... ...里,在酒吧爷爷唱的英文歌,而且问黑人可不可以唱的那首歌叫什么... 电视剧婚姻物语中郑伊健失恋的时候在酒吧唱的那首歌叫什么名字... 电影好命先生 38分钟的时候在酒吧里放的那首歌叫什么,我只听清楚最后一... 《ps.i love you》中的男主角年轻时在酒吧,看到女主角时唱的歌 电影爱你一生一世在酒吧里唱的那首歌叫什么 ...要求打左推右攻的打法,本人打横拍,求推荐一个球拍配置, 我是挺厉害的横拍选手,买什么乒乓球拍好呢? 本人想配个乒乓球拍(横拍)230左右请专业人士给些方案(性价比要高... 专升本哪些专业更好就业? 湖南专升本哪个专业好些 乒乓球拍DIY:横拍 底板&amp;正反面套胶 推荐型号,胶水用什么好,请有经验者... 帮忙组装一个乒乓球 横拍... [Netty原理解析-1]-创建Java客户端和服务端,连接Netty (然后逐步... 在吗"D-link DI524M 韧体v1.05CN 断线问题"之前你有问这个问题,后面是... DI-524M路由器韧体由1.0升级到1.05后经常出现上不了网的情况咋办?_百 ... D-link DI 524M 端口转发 80端口设置了没啥用 花生壳依然远程链接不上... dlink Di-524m怎样升级(不是无线的) 心怡的女孩发来的空间说说的生日祝福应该怎么样回复 过生日朋友圈文案 ...生日红包祝福,用短语怎么感谢好闺蜜发我的生日红包 关于一个人生日的说说心情短语大全 今天误会同学生日,去祝她生日快乐结果她说谢谢,不过今天不是她生日,如... 如果前女友生日我送了礼物又说了生日快乐,她说谢谢,我应该怎么回 别人祝我生日快乐我说谢谢,她说不谢只是嘴上说哦我该怎么回答 潜意识是什么意思,请问是不是这个意思,比如,原子弹是个可以毁灭一座城市... 00后表白暗号 “男生发308是什么意思”是什么意思? 网络用语暗示怎么说 什么是女生发308? 在陌陌上用“暗号”聊天是一种什么感受? 闺蜜防家长的暗号? 对你们来说,童年是什么样?跟长大后有什么区别?