共计 2580 个字符,预计需要花费 7 分钟才能阅读完成。
简介
在咱们之前提到的所有 netty 常识中,netty 如同都被分为客户端和服务器端两局部。服务器端监听连贯,并对连贯中的音讯进行解决。而客户端则向服务器端建设申请连贯,从而能够发送音讯。
然而这所有都要在 UDT 协定中被终结,因为 UDT 提供了 Rendezvous,一种平等的连贯类型,节点之间是对等关系。
素来都没有救世主,也没有神仙和皇帝,只有同为节点的好兄弟。
建设反对 Rendezvous 的服务器
因为是对等的关系,所以这里不须要应用到 ServerBootstrap, 应用一般的 Bootstrap 就够了。
group 还是要的,这里应用 NioEventLoopGroup,NioEventLoopGroup 须要提供了 SelectorProvider。UDT 提供了两种 provider, 别离是 NioUdtProvider.BYTE_PROVIDER 和 NioUdtProvider.MESSAGE_PROVIDER, 别离示意 stream 和 message 两种格局:
final NioEventLoopGroup connectGroup = new NioEventLoopGroup(1, | |
connectFactory, NioUdtProvider.BYTE_PROVIDER); | |
final NioEventLoopGroup connectGroup = new NioEventLoopGroup(1, | |
connectFactory, NioUdtProvider.MESSAGE_PROVIDER); |
接下来就是创立 Bootstrap,并绑定 group 和设置 channelFactory.
当然,这里的 channelFactory 也有两种,别离是 NiNioUdtProvider.BYTE_RENDEZVOUS 和 NioUdtProvider.BYTE_RENDEZVOUS。
那么能够有上面两种创立的办法, 第一种是 byte stream 的:
final Bootstrap bootstrap = new Bootstrap(); | |
bootstrap.group(connectGroup) | |
.channelFactory(NioUdtProvider.BYTE_RENDEZVOUS) | |
.handler(new ChannelInitializer<UdtChannel>() { | |
@Override | |
protected void initChannel(UdtChannel ch) throws Exception {ch.pipeline().addLast(new LoggingHandler(LogLevel.INFO), | |
new UDTByteHandler(messageSize)); |
第二种是 message 的:
final Bootstrap boot = new Bootstrap(); | |
boot.group(connectGroup) | |
.channelFactory(NioUdtProvider.MESSAGE_RENDEZVOUS) | |
.handler(new ChannelInitializer<UdtChannel>() { | |
@Override | |
public void initChannel(final UdtChannel ch) | |
throws Exception {ch.pipeline().addLast(new LoggingHandler(LogLevel.INFO), | |
new UDTMsgHandler(messageSize)); | |
} | |
}); |
至此,两个反对不同 UDT 类型的 Rendezvous 服务器就建设起来了。
接下来就是对音讯的解决了。
解决不同的音讯
有了反对 byte 和 message 两种格局的服务器,接下来就是如何解决对应的音讯了。
对于 byte 格局的 UDT,channel 中传输的音讯就是 ByteBuf,咱们只须要构建 ByteBuf 的音讯,而后在 channel 中传输即可:
private final ByteBuf message | |
message = Unpooled.buffer(messageSize); | |
message.writeBytes("www.flydean.com".getBytes(StandardCharsets.UTF_8)); | |
ctx.writeAndFlush(message); |
对应 message 格局的 UDT,netty 提供了一个专门的类 UdtMessage 对其进行封装,UdtMessage 继承值 DefaultByteBufHolder,他就是对 ByteBuf 的封装。
咱们能够这样创立一个 UdtMessage 并发送它:
private final UdtMessage message; | |
final ByteBuf byteBuf = Unpooled.buffer(messageSize); | |
byteBuf.writeBytes("www.flydean.com".getBytes(StandardCharsets.UTF_8)); | |
message = new UdtMessage(byteBuf); | |
ctx.writeAndFlush(message); |
节点之间的交互
下面咱们别离建设了两个节点,这两个节点是对等关系,那么怎么将这两个节点分割起来呢?
咱们调用 Bootstrap 的 connect 办法如下:
final ChannelFuture f = boot.connect(peer, self).sync(); | |
f.channel().closeFuture().sync(); |
这里的 connect 传入两个 SocketAddress 参数,第一个参数是 remoteAddress, 第二个参数示意的是 localAddress.
当然,connect 还有一种罕用的用法就是连贯到近程的服务器:
public ChannelFuture connect(String inetHost, int inetPort)
这也是咱们最常见的那种用法。
总结
以上就是 UDT 中的 Rendezvous 的应用。
本文的例子能够参考:learn-netty4
本文已收录于 http://www.flydean.com/41-netty-udt-byte-message/
最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!
欢送关注我的公众号:「程序那些事」, 懂技术,更懂你!