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

netty系列之:选byte还是选message?这是一个问题

0
分享至

简介

UDT给了你两种选择,byte stream或者message,到底选哪一种呢?经验告诉我们,只有小学生才做选择题,而我们应该全都要!

类型的定义

UDT的两种类型是怎么定义的呢?

翻看com.barchart.udt包,可以发现这两种类型定义在TypeUDT枚举类中。

STREAM(1),
DATAGRAM(2),

一个叫做STREAM,它的code是1。一个叫做DATAGRAM,他的code是2.

根据两个不同的类型我们可以创建不同的selectorProvider和channelFactory。而这两个正是构建netty服务所需要的。

在NioUdtProvider这个工具类中,netty为我们提供了TypeUDT和KindUDT的六种组合ChannelFactory,他们分别是:

用于Stream的:BYTE_ACCEPTOR,BYTE_CONNECTOR,BYTE_RENDEZVOUS。

和用于Message的:MESSAGE_ACCEPTOR,MESSAGE_CONNECTOR和MESSAGE_RENDEZVOUS。

同样的,还有两个对应的SelectorProvider,分别是:

BYTE_PROVIDER 和 MESSAGE_PROVIDER.
搭建UDT stream服务器

如果要搭建UDT stream服务器,首先需要使用NioUdtProvider.BYTE_PROVIDER来创建NioEventLoopGroup:

final NioEventLoopGroup acceptGroup = new NioEventLoopGroup(1, acceptFactory, NioUdtProvider.BYTE_PROVIDER);
final NioEventLoopGroup connectGroup = new NioEventLoopGroup(1, connectFactory, NioUdtProvider.BYTE_PROVIDER);

这里,我们创建两个eventLoop,分别是acceptLoop和connectLoop。

接下来就是在ServerBootstrap中绑定上面的两个group,并且指定channelFactory。这里我们需要NioUdtProvider.BYTE_ACCEPTOR:

final ServerBootstrap boot = new ServerBootstrap();
boot.group(acceptGroup, connectGroup)
.channelFactory(NioUdtProvider.BYTE_ACCEPTOR)
.option(ChannelOption.SO_BACKLOG, 10)
.handler(new LoggingHandler(LogLevel.INFO))
.childHandler(new ChannelInitializer() {
@Override
public void initChannel(final UdtChannel ch) {
ch.pipeline().addLast(
new LoggingHandler(LogLevel.INFO),
new UDTByteEchoServerHandler());

就这么简单。

搭建UDT message服务器

搭建UDT message服务器的步骤和stream很类似,不同的是需要使用NioUdtProvider.MESSAGE_PROVIDER作为selectorProvider:

final NioEventLoopGroup acceptGroup =
new NioEventLoopGroup(1, acceptFactory, NioUdtProvider.MESSAGE_PROVIDER);
final NioEventLoopGroup connectGroup =
new NioEventLoopGroup(1, connectFactory, NioUdtProvider.MESSAGE_PROVIDER);

然后在绑定ServerBootstrap的时候使用NioUdtProvider.MESSAGE_ACCEPTOR作为channelFactory:

final ServerBootstrap boot = new ServerBootstrap();
boot.group(acceptGroup, connectGroup)
.channelFactory(NioUdtProvider.MESSAGE_ACCEPTOR)
.option(ChannelOption.SO_BACKLOG, 10)
.handler(new LoggingHandler(LogLevel.INFO))
.childHandler(new ChannelInitializer() {
@Override
public void initChannel(final UdtChannel ch)
throws Exception {
ch.pipeline().addLast(
new LoggingHandler(LogLevel.INFO),
new UDTMsgEchoServerHandler());

同样很简单。

Stream和Message的handler

不同的UDT类型,需要使用不同的handler。

对于Stream来说,它的底层是byte,所以我们的消息处理也是以byte的形式进行的,我们以下面的方式来构建message:

private final ByteBuf message;
message = Unpooled.buffer(UDTByteEchoClient.SIZE);
message.writeBytes("www.flydean.com".getBytes(StandardCharsets.UTF_8));

然后使用ctx.writeAndFlush(message)将其写入到channel中。

对于message来说,它实际上格式对ByteBuf的封装。netty中有个对应的类叫做UdtMessage:

public final class UdtMessage extends DefaultByteBufHolder

UdtMessage是一个ByteBufHolder,所以它实际上是一个ByteBuf的封装。

我们需要将ByteBuf封装成UdtMessage:

private final UdtMessage message;
final ByteBuf byteBuf = Unpooled.buffer(UDTMsgEchoClient.SIZE);
byteBuf.writeBytes("www.flydean.com".getBytes(StandardCharsets.UTF_8));
message = new UdtMessage(byteBuf);

然后将这个UdtMessage发送到channel中:

ctx.writeAndFlush(message);

这样你就学会了在UDT协议中使用stream和message两种数据类型了。

总结

大家可能觉得不同的数据类型原来实现起来这么简单。这全都要归功于netty优秀的封装和设计。

感谢netty!

本文的例子可以参考:learn-netty4

本文已收录于 http://www.flydean.com/40-netty-udt-support-2/

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

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.

相关推荐
热点推荐
汽车下乡重磅补贴落地!农村户口买车省3万,利弊一定要看清楚

汽车下乡重磅补贴落地!农村户口买车省3万,利弊一定要看清楚

趣味萌宠的日常
2026-06-20 06:22:27
太解气!印度挖通13公里隧道举国狂欢,中国反手掏出600台盾构机

太解气!印度挖通13公里隧道举国狂欢,中国反手掏出600台盾构机

离离言几许
2026-06-18 12:12:17
1.2万亿顺差创百年纪录,张燕生却警告:再赚下去,中国要有麻烦

1.2万亿顺差创百年纪录,张燕生却警告:再赚下去,中国要有麻烦

趣文说娱
2026-05-29 20:13:52
全球最割裂的股市规则!全世界都是自由T+0,唯独大A散户锁死T+1

全球最割裂的股市规则!全世界都是自由T+0,唯独大A散户锁死T+1

王二哥老搞笑
2026-06-09 20:28:44
外交部:中国政府已决定再次向刚果(金)等提供紧急人道主义援助

外交部:中国政府已决定再次向刚果(金)等提供紧急人道主义援助

国际在线
2026-06-22 19:23:03
孙科一辈子没叫过宋庆龄一声妈,却在1949年替她挡了蒋介石一刀

孙科一辈子没叫过宋庆龄一声妈,却在1949年替她挡了蒋介石一刀

近史谈
2026-06-21 15:36:49
生育大局已定!2026年新生人口变化曝光:年轻人不生,根本不是懒

生育大局已定!2026年新生人口变化曝光:年轻人不生,根本不是懒

离离言几许
2026-06-18 22:49:16
卡拉格:担心斯通斯的体能消耗;现阶段完全没必要让赖斯休息

卡拉格:担心斯通斯的体能消耗;现阶段完全没必要让赖斯休息

懂球帝
2026-06-22 23:47:17
事态升级!娜然坐霍家主桌照片曝光,已被认可,霍启刚评论区沦陷

事态升级!娜然坐霍家主桌照片曝光,已被认可,霍启刚评论区沦陷

临云史策
2026-06-21 12:35:01
100个做肠镜的人,95个都查出息肉,但只有不到3个的息肉会变成癌

100个做肠镜的人,95个都查出息肉,但只有不到3个的息肉会变成癌

路医生健康科普
2026-06-19 12:00:11
国家统计局披露1至5月酒业产量:白酒产量下滑超4%

国家统计局披露1至5月酒业产量:白酒产量下滑超4%

南方都市报
2026-06-22 20:36:16
PPO树脂比电子布更猛?AI材料缺口,真正赢家在这里

PPO树脂比电子布更猛?AI材料缺口,真正赢家在这里

呼呼历史论
2026-06-21 09:18:30
劲爆!世界杯|葡萄牙边锋孔塞桑:我们没有义务传球给C罗!

劲爆!世界杯|葡萄牙边锋孔塞桑:我们没有义务传球给C罗!

kio鱼
2026-06-22 10:01:58
伟大的2-2!世界杯最大黑马诞生? 逼平两大世界冠军实现国足目标

伟大的2-2!世界杯最大黑马诞生? 逼平两大世界冠军实现国足目标

报君知史
2026-06-22 12:33:33
“只有学渣家长会这样”,母亲在考场前失态,网友:你到底哭啥?

“只有学渣家长会这样”,母亲在考场前失态,网友:你到底哭啥?

泽泽先生
2026-06-22 19:49:50
两地块入市 东北四环地块起始楼面价6.4万元/平

两地块入市 东北四环地块起始楼面价6.4万元/平

坠入二次元的海洋
2026-06-22 18:30:26
赵薇女儿为妈妈庆生,公开晒照片,震惊网友:这姐,到底经历了啥?

赵薇女儿为妈妈庆生,公开晒照片,震惊网友:这姐,到底经历了啥?

海阔山遥YAO
2026-06-21 06:03:48
与高市G7撕破脸后,特朗普宣布再访华,日本押注中美对抗满盘皆输

与高市G7撕破脸后,特朗普宣布再访华,日本押注中美对抗满盘皆输

霁寒飘雪
2026-06-22 22:04:02
34岁周冬雨无戏可拍?原因很简单,不是因为年纪大,也不是片酬高

34岁周冬雨无戏可拍?原因很简单,不是因为年纪大,也不是片酬高

往史过眼云烟
2026-06-20 11:31:03
谈了18个小时!终于迎来结果,伊朗代表当场破防,全程咬牙没离场

谈了18个小时!终于迎来结果,伊朗代表当场破防,全程咬牙没离场

云上乌托邦
2026-06-22 15:37:30
2026-06-23 00:24:49
flydean程序那些事
flydean程序那些事
最通俗的解读,最深刻的干货!
356文章数 438关注度
往期回顾 全部

科技要闻

马云与阿里巴巴众高管下田插秧

头条要闻

媒体:中国"两箭齐发"反制美国 不卖了也不买了

头条要闻

媒体:中国"两箭齐发"反制美国 不卖了也不买了

体育要闻

法国球星祝中国队下届世界杯取得好成绩

娱乐要闻

陪睡陪玩是皮毛,向佐揭内娱暗规则

财经要闻

前美联储主席格林斯潘去世 享年100岁

汽车要闻

华为智驾ADS限时优惠月底结束 7月1日前下订立省3000元

态度原创

家居
房产
手机
艺术
公开课

家居要闻

绿意盎然 自然之境

房产要闻

一年时间,36个盘“消失”!海口楼市,罕见“大收缩”!

手机要闻

罗永浩曾痛批iPhone设计属于二流 苹果新CEO调转方向:将设计视为第一优先级

艺术要闻

光设计就刷屏!南京“绿洲大厦”,层层像梯田!

公开课

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

无障碍浏览 进入关怀版