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