简介
在咱们之前提到的所有 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/
最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!
欢送关注我的公众号:「程序那些事」, 懂技术,更懂你!