乐趣区

关于java:netty系列之真正的平等–UDT中的Rendezvous

简介

在咱们之前提到的所有 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/

最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!

欢送关注我的公众号:「程序那些事」, 懂技术,更懂你!

退出移动版