网易首页 > 网易号 > 正文 申请入驻

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

0
分享至

简介

对于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依赖环境:

io.netty
netty-transport-native-epoll
${project.version}
linux-x86_64

...

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

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

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

io.netty
netty-transport-native-kqueue
${project.version}
osx-x86_64

...

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 → EpollEventLoopGroup
NioEventLoop → EpollEventLoop
NioServerSocketChannel → EpollServerSocketChannel
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 + "\r\n");
// 如果输入'再见',则等待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传输协议的使用,具体的代码,大家可以参考:

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

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
中国海关出手!禁止进口印度大米,给出的理由,让印度人难以接受

中国海关出手!禁止进口印度大米,给出的理由,让印度人难以接受

聊历史的阿稼
2026-04-23 18:02:20
马克龙、斯塔默、默茨全崩盘,极右翼席卷欧洲,这次真挡不住了

马克龙、斯塔默、默茨全崩盘,极右翼席卷欧洲,这次真挡不住了

古史青云啊
2026-06-03 12:08:08
胡锡进哭晕在厕所!和王月眉吃饭照片曝光,汤家凤的质问一针见血

胡锡进哭晕在厕所!和王月眉吃饭照片曝光,汤家凤的质问一针见血

小椰的奶奶
2026-06-03 15:58:37
「璐学」彻底火了!李小璐开卷国学文化赛道,被全网群嘲

「璐学」彻底火了!李小璐开卷国学文化赛道,被全网群嘲

雷科技
2026-06-01 16:20:18
北欧海盗来了,哈兰德发布维京装束风格自拍为世界杯出征造势

北欧海盗来了,哈兰德发布维京装束风格自拍为世界杯出征造势

懂球帝
2026-06-02 20:28:06
最大回撤40%,可以抄底了?

最大回撤40%,可以抄底了?

好买研习社
2026-06-02 17:54:42
印度最高种姓“婆罗门”到底有多牛?永享一项特权,出生就是贵族

印度最高种姓“婆罗门”到底有多牛?永享一项特权,出生就是贵族

网络易不易
2026-06-02 06:00:35
政变只是一个开始,伊朗要变天了,中国最担心的事情,恐将发生

政变只是一个开始,伊朗要变天了,中国最担心的事情,恐将发生

墨羽怪谈
2026-04-14 09:39:31
“童颜巨乳”小姐姐来袭!

“童颜巨乳”小姐姐来袭!

文刀万
2026-05-17 17:06:53
中产为什么宁愿等三周,也要开走Model Y?

中产为什么宁愿等三周,也要开走Model Y?

沙雕小琳琳
2026-05-31 02:36:50
腾讯将推出微信智能体,市值一天上涨3600亿元

腾讯将推出微信智能体,市值一天上涨3600亿元

财经杂志
2026-06-03 10:10:51
扎心!西媒曝恩里克曾告诉大巴黎主席:姆巴佩在他无法掌控全局

扎心!西媒曝恩里克曾告诉大巴黎主席:姆巴佩在他无法掌控全局

雪狼侃体育
2026-06-02 17:37:07
434辆车等你选!今年第一期京牌小客车司法处置启动

434辆车等你选!今年第一期京牌小客车司法处置启动

新浪财经
2026-06-03 13:05:14
下个风华高科?这家7元低价+MLCC树脂龙+社保重仓  主力暴抢8亿元

下个风华高科?这家7元低价+MLCC树脂龙+社保重仓 主力暴抢8亿元

元芳说投资
2026-06-03 06:30:08
倪萍这辈子“最恨”的男人,或许并非是陈凯歌,而是最冷血的他

倪萍这辈子“最恨”的男人,或许并非是陈凯歌,而是最冷血的他

南风的温柔
2026-06-03 09:54:51
疯狂的黄俄计划:80万东北土地、2千万东北人民,沙俄全想要?

疯狂的黄俄计划:80万东北土地、2千万东北人民,沙俄全想要?

鹤羽说个事
2026-05-28 23:03:03
政治天才石勒

政治天才石勒

奥卡姆剃历史
2026-06-02 09:47:15
刘国梁到底有多狠?弃用郝帅和陈玘,用天才前途换国乒的万无一失

刘国梁到底有多狠?弃用郝帅和陈玘,用天才前途换国乒的万无一失

老玮是个手艺人
2026-03-27 14:46:10
奚梦瑶:大老公6岁,梁安琪经全面调查后认为其是千挑万选的儿媳

奚梦瑶:大老公6岁,梁安琪经全面调查后认为其是千挑万选的儿媳

童叔不飙车
2026-06-02 23:00:25
1992年邱会作到北京,老战友请他吃饭,张震席间连连称“老同学”

1992年邱会作到北京,老战友请他吃饭,张震席间连连称“老同学”

大运河时空
2026-06-02 11:40:03
2026-06-03 16:35:00
flydean程序那些事
flydean程序那些事
最通俗的解读,最深刻的干货!
356文章数 438关注度
往期回顾 全部

科技要闻

员工抗议键鼠追踪,Meta让步:可暂停30分钟

头条要闻

被出轨丈夫家暴10年 女子起诉离婚发现1400万已被转走

头条要闻

被出轨丈夫家暴10年 女子起诉离婚发现1400万已被转走

体育要闻

选择中国品牌的库里,和他们的巨大野心

娱乐要闻

著名演员魏宗万去世!曾演活司马懿

财经要闻

左手通胀右手衰退,欧美当下的困局

汽车要闻

依托全域辅助驾驶布局 千里浩瀚助推吉利5月市场大热

态度原创

本地
时尚
教育
手机
公开课

本地新闻

用剪纸的方式,打开江苏扬州

休闲T恤舒适感极佳,夏天必不可少!轻轻松松拿捏日常的造型

教育要闻

2026年全国高考报名人数为1290万人

手机要闻

行业首个:荣耀Magic8/500/X70全系列已支持微信A2A助手能力

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版