netty 系列之: 选 byte 还是选 message? 这是一个问题
简介
UDT 给了你两种选择,byte stream 或者 message,到底选哪一种呢?经验告诉我们,只有小学生才做选择题,而我们应该全都要!
类型的定义
UDT 的两种类型是怎么定义的呢?
翻看 com.barchart.udt 包,可以发现这两种类型定义在 TypeUDT 枚举类中。
一个叫做 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,分别是:
搭建 UDT stream 服务器
如果要搭建 UDT stream 服务器,首先需要使用 NioUdtProvider.BYTE_PROVIDER 来创建 NioEventLoopGroup:
这里,我们创建两个 eventLoop,分别是 acceptLoop 和 connectLoop。
接下来就是在 ServerBootstrap 中绑定上面的两个 group,并且指定 channelFactory。这里我们需要 NioUdtProvider.BYTE_ACCEPTOR:
就这么简单。
搭建 UDT message 服务器
搭建 UDT message 服务器的步骤和 stream 很类似,不同的是需要使用 NioUdtProvider.MESSAGE_PROVIDER 作为 selectorProvider:
然后在绑定 ServerBootstrap 的时候使用 NioUdtProvider.MESSAGE_ACCEPTOR 作为 channelFactory:
同样很简单。
Stream 和 Message 的 handler
不同的 UDT 类型,需要使用不同的 handler。
对于 Stream 来说,它的底层是 byte,所以我们的消息处理也是以 byte 的形式进行的,我们以下面的方式来构建 message:
然后使用 ctx.writeAndFlush(message)将其写入到 channel 中。
对于 message 来说,它实际上格式对 ByteBuf 的封装。netty 中有个对应的类叫做 UdtMessage:
UdtMessage 是一个 ByteBufHolder,所以它实际上是一个 ByteBuf 的封装。
我们需要将 ByteBuf 封装成 UdtMessage:
然后将这个 UdtMessage 发送到 channel 中:
这样你就学会了在 UDT 协议中使用 stream 和 message 两种数据类型了。
总结
大家可能觉得不同的数据类型原来实现起来这么简单。这全都要归功于 netty 优秀的封装和设计。
感谢 netty!
本文的例子可以参考:learn-netty4
本文已收录于 http://www.flydean.com/40-netty-udt-support-2/
最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!
欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!
版权声明: 本文为 InfoQ 作者【程序那些事】的原创文章。
原文链接:【http://xie.infoq.cn/article/d1d7138d2eda25ec101c31e30】。文章转载请联系作者。
评论