简介在我们之前提到的所有netty知识中,netty似乎分为客户端和服务端两部分。服务器侦听连接并处理连接中的消息。客户端建立到服务器的请求连接,以便可以发送消息。但是这一切都必须终止在UDT协议中,因为UDT提供了Rendezvous,一种对等的连接类型,以及节点之间的对等关系。从来没有救世主,也没有仙人,也没有帝王,只有同为节点的好兄弟。建立一个支持Rendezvous的服务器是点对点的关系,所以这里没有必要使用ServerBootstrap,普通的Bootstrap就可以了。该组仍然是必需的。这里使用了NioEventLoopGroup,NioEventLoopGroup需要提供一个SelectorProvider。UDT提供了两个provider,分别是NioUdtProvider.BYTE_PROVIDER和NioUdtProvider.MESSAGE_PROVIDER,分别代表stream和message两种格式:finalNioEventLoopGroupconnectGroup=newNioEventLoopGroup(1,connectFactory,NioUdtProvider.BYTE_PROVIDER);finalNioEventLoopGroupconnectGroup=newNioEventLoopGroup(1,connectFactory,NioUdtProvider.BYTE_PROVIDER);最终Group1NioEventLoopEventLoop(newGroup1NioEventLoopE,connectFactory,NioUdtProvider.MESSAGE_PROVIDER);下一步是创建Bootstrap,绑定组并设置channelFactory。当然这里的channelFactory有两种,分别是NiNioUdtProvider.BYTE_RENDEZVOUS和NioUdtProvider.BYTE_RENDEZVOUS。那么有两种创建方式,第一种是字节流:finalBootstrapbootstrap=newBootstrap();bootstrap.group(connectGroup).channelFactory(NioUdtProvider.BYTE_RENDEZVOUS).handler(newChannelInitializer(){@OverrideprotectedvoidinitChannel(UdtChannelch)抛出异常{ch.pipeline().addLast(newLoggingHandler(LogLevel.INFO),newUDTByteHandler(messageSize));第二个是消息:finalBootstrapboot=newBootstrap();boot.group(connectGroup).channelFactory(NioUdtProvider.MESSAGE_RENDEZVOUS).handler(newChannelInitializer(){@OverridepublicvoidinitChannel(finalUdtChannelch)抛出异常{ch.pipeline().addLast(newLoggingHandler(LogLevel.INFO),newUDTMsgHandler(messageSize));}});至此,已经建立了两个支持不同UDT类型的Rendezvous服务器,接下来就是对消息的处理了。处理不同的消息有了同时支持字节和消息格式的服务器,下一步就是如何处理相应的消息。对于字节格式的UDT,通道中传输的消息是ByteBuf,我们只需要构造ByteBuf消息,然后在通道中传输即可:privatefinalByteBufmessagemessage=Unpooled.buffer(messageSize);message.writeBytes("www.flydean.com".getBytes(StandardCharsets.UTF_8));ctx.writeAndFlush(消息);对应消息格式中的UDT,netty提供了一个专门的类UdtMessage对其进行封装。UdtMessage继承了值DefaultByteBufHolder,是对ByteBuf的封装。我们可以创建一个UdtMessage并像这样发送它:privatefinalUdtMessagemessage;finalByteBufbyteBuf=Unpooled.buffer(messageSize);byteBuf.writeBytes("www.flydean.com".getBytes(StandardCharsets.UTF_8));message=newUdtMessage(byteBuf);ctx.writeAndFlush(消息);节点之间的交互上面我们建立了两个节点,这两个节点是点对点的,那么这两个节点怎么连接呢?我们这样调用Bootstrap的connect方法:finalChannelFuturef=boot.connect(peer,self).sync();f.channel().closeFuture().sync();这里connect传入了两个SocketAddress参数,第一个参数是remoteAddress,第二个参数代表localAddress。当然connect还有一个常见的用法是连接远程服务器:publicChannelFutureconnect(StringinetHost,intinetPort)这也是我们最常见的用法。综上所述,以上就是UDT中Rendezvous的使用。本文示例可参考:learn-netty4本文已收录于http://www.flydean.com/41-netty-udt-byte-message/最通俗的解读,最深刻的干货,最简洁的教程,许多你不为人知的小技巧等你来发现!欢迎关注我的公众号:《程序那些事儿》,懂技术,更懂你!