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

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.

相关推荐
热点推荐
日本“国宝级”成人女优来中国台湾卖春被抓!车夫时薪66元跑腿,下场比她还惨……

日本“国宝级”成人女优来中国台湾卖春被抓!车夫时薪66元跑腿,下场比她还惨……

日本物语
2026-06-02 21:05:34
山西沁源县委书记赵永进被查,此前当地煤矿爆炸致82人死亡

山西沁源县委书记赵永进被查,此前当地煤矿爆炸致82人死亡

知知贵阳
2026-06-02 22:06:03
俄乌网被禁言,就想知道谁给了它挑衅甚至辱骂中国网民的底气?

俄乌网被禁言,就想知道谁给了它挑衅甚至辱骂中国网民的底气?

壹家言
2026-06-02 11:25:28
“宿迁阿斗”,国补都扶不起京东?

“宿迁阿斗”,国补都扶不起京东?

七使2022
2026-06-02 16:21:50
“爸妈,我开辅助驾驶,你们放心”:一家三口全死了,智驾1分钟

“爸妈,我开辅助驾驶,你们放心”:一家三口全死了,智驾1分钟

江山挥笔
2026-06-02 18:47:02
一公务员被指玩弄女性感情,两米多高易拉宝摆放在财政局门外,佛山市财政局回应

一公务员被指玩弄女性感情,两米多高易拉宝摆放在财政局门外,佛山市财政局回应

深圳晚报
2026-06-02 14:20:18
“根本不敢开空调”! 大量一汽大众新车狂喷粉末:4S店想“封口”,官方称“无害”遭专家反驳

“根本不敢开空调”! 大量一汽大众新车狂喷粉末:4S店想“封口”,官方称“无害”遭专家反驳

新浪财经
2026-06-02 17:38:32
铜价:大家做好心理准备!从今天6月2日开始,或有更大调整行情

铜价:大家做好心理准备!从今天6月2日开始,或有更大调整行情

花小猫的美食日常
2026-06-02 18:20:46
阿迪达斯“在城里办事”文案已删除,回应“进城办事”T恤被网友催上架:目前还没有售卖,后续可关注门店

阿迪达斯“在城里办事”文案已删除,回应“进城办事”T恤被网友催上架:目前还没有售卖,后续可关注门店

19楼
2026-06-02 15:37:57
25万亿!国家启动史无前例超级大基建,信号强烈

25万亿!国家启动史无前例超级大基建,信号强烈

前瞻网
2026-06-02 10:49:44
六神新包装撞脸人民币!网友不淡定了

六神新包装撞脸人民币!网友不淡定了

李东阳朋友圈
2026-06-02 18:16:17
养老金上涨正式敲定!新标准出炉,快看看你每月多领多少?

养老金上涨正式敲定!新标准出炉,快看看你每月多领多少?

新国学文化
2026-06-01 19:33:28
055和基洛夫并排的对比图,我才惊觉军舰设计已经隔了一个时代

055和基洛夫并排的对比图,我才惊觉军舰设计已经隔了一个时代

安安说
2026-06-02 12:46:29
唐山货车司机大热天捎七旬老人40公里,临下车老人突然变脸讹钱

唐山货车司机大热天捎七旬老人40公里,临下车老人突然变脸讹钱

听心堂
2026-06-02 12:03:05
李连杰一家三口拜见仁波切,64岁利智许久不见,颜值回春如昔日!

李连杰一家三口拜见仁波切,64岁利智许久不见,颜值回春如昔日!

娱乐团长
2026-06-02 15:09:12
22岁身价1.4亿欧,世一腰横空出世!手握2座欧冠,曼联苦笑

22岁身价1.4亿欧,世一腰横空出世!手握2座欧冠,曼联苦笑

万花筒体育球球
2026-06-02 20:20:00
惊掉下巴!女生索要9000元换手机,男友转账附上“以结婚为目的”

惊掉下巴!女生索要9000元换手机,男友转账附上“以结婚为目的”

火山詩话
2026-06-02 16:32:30
男子自驾青海失联9个月,家属再赴事发地寻找 救援人员计划向牧民发寻人信息寻找目击者

男子自驾青海失联9个月,家属再赴事发地寻找 救援人员计划向牧民发寻人信息寻找目击者

红星新闻
2026-06-02 17:40:41
0-3首败!中国男足意外崩盘,以小打大完败非洲劲旅,争冠变难了

0-3首败!中国男足意外崩盘,以小打大完败非洲劲旅,争冠变难了

侃球熊弟
2026-06-02 22:38:29
白俄罗斯总统:金正恩不是也不可能是独裁者

白俄罗斯总统:金正恩不是也不可能是独裁者

俄罗斯卫星通讯社
2026-06-02 15:11:02
2026-06-03 04:12:49
flydean程序那些事
flydean程序那些事
最通俗的解读,最深刻的干货!
356文章数 438关注度
往期回顾 全部

科技要闻

烧掉千亿后,美团、阿里、京东谁先止血?

头条要闻

演员魏宗万去世 曾在94版《三国演义》中饰演"司马懿"

头条要闻

演员魏宗万去世 曾在94版《三国演义》中饰演"司马懿"

体育要闻

1米74的业余联赛替补,在英超踢中卫

娱乐要闻

奚梦瑶何猷君补办婚礼超幸福

财经要闻

智元和宇树的“暗战”愈演愈烈

汽车要闻

星途神秘新车轮廓曝光 又一款性能SUV要来了?

态度原创

教育
旅游
亲子
游戏
军事航空

教育要闻

“没选上少先队,我女儿疯了”,无理取闹的家长,养不出正常孩子

旅游要闻

北京位列全球数字旅游引领型城市榜首

亲子要闻

《前面有多生气,后面就有多搞笑》

离发售不远了!《寂静岭》系列新作已公开游戏评级

军事要闻

伊朗媒体新发布最高领袖照片

无障碍浏览 进入关怀版