
io-nio
文章平均质量分 91
superfjj
懂程序更懂你!微信公众号:程序那些事 个人主页:www.flydean.com 最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧,尽在程序那些事!
展开
-
netty系列之:kequeue传输协议详解
在前面的章节中,我们介绍了在netty中可以使用kequeue或者epoll来实现更为高效的native传输方式。那么kequeue和epoll和NIO传输协议有什么不同呢?本章将会以kequeue为例进行深入探讨。在上面我们介绍的native的例子中,关于kqueue的类有这样几个,分别是KQueueEventLoopGroup,KQueueServerSocketChannel和KQueueSocketChannel,通过简单的替换和添加对应的依赖包,我们可以轻松的将普通的NIO netty服务替换成为原创 2022-07-04 15:25:32 · 561 阅读 · 0 评论 -
netty系列之:在netty中使用native传输协议
对于IO来说,除了传统的block IO,使用最多的就是NIO了,通常我们在netty程序中最常用到的就是NIO,比如NioEventLoopGroup,NioServerSocketChannel等。我们也知道在IO中有比NIO更快的IO方式,比如kqueue和epoll,但是这两种方式需要native方法的支持,也就是说需要在操作系统层面提供服务。如果我们在支持Kqueue或者epoll的服务器上,netty是否可以提供对这些优秀IO的支持呢?答案是肯定的。但是首先kqueue和epoll需要JNI支持原创 2022-06-29 20:17:08 · 746 阅读 · 0 评论 -
netty系列之:给ThreadLocal插上梦想的翅膀,详解FastThreadLocal
JDK中的ThreadLocal可以通过get方法来获得跟当前线程绑定的值。而这些值是存储在ThreadLocal.ThreadLocalMap中的。而在ThreadLocalMap中底层的数据存储是一个Entry数组中的。那么从ThreadLocalMap中获取数据的速度如何呢?速度有没有可以优化的空间呢?一起来看看。ThreadLocalMap作为一个Map,它的底层数据存储是一个Entry类型的数组:我们再来回顾一下ThreadLocal是怎么获取数据的:首先根据ThreadLocal对象中的th原创 2022-06-01 13:51:16 · 263 阅读 · 0 评论 -
可能有人听过ThreadLocal,但一定没人听过ThreadLocal对象池
文章目录简介ThreadLocalThreadLocalMapRecycler总结简介JDK中的Thread大家肯定用过,只要是用过异步编程的同学肯定都熟悉。为了保存Thread中特有的变量,JDK引入了ThreadLocal类来专门对Thread的本地变量进行管理。ThreadLocal很多新人可能不明白ThreadLocal到底是什么,它和Thread到底有什么关系。其实很简单,ThreadLocal本质上是一个key,它的value就是Thread中一个map中存储的值。每个Thread中原创 2022-05-25 17:55:17 · 206 阅读 · 0 评论 -
netty系列之:protobuf在UDP协议中的使用
文章目录简介UDP在netty中的表示DatagramPacketEncoderDatagramPacketDecoder总结简介netty中提供的protobuf编码解码器可以让我们直接在netty中传递protobuf对象。同时netty也提供了支持UDP协议的channel叫做NioDatagramChannel。如果直接使用NioDatagramChannel,那么我们可以直接从channel中读写UDP对象:DatagramPacket。但是DatagramPacket中封装的是ByteBu原创 2022-05-23 15:22:22 · 810 阅读 · 2 评论 -
netty系列之:netty对marshalling的支持
文章目录简介netty中的marshalling providerMarshalling编码器Marshalling编码的另外一种实现总结简介在之前的文章中我们讲过了,jboss marshalling是一种非常优秀的java对象序列化的方式,它可以兼容JDK自带的序列化,同时也提供了性能和使用上的优化。那么这么优秀的序列化工具可不可以用在netty中作为消息传递的方式呢?答案当然是肯定的,在netty中一切皆有可能。netty中的marshalling provider回顾一下jboss ma原创 2022-05-20 15:52:19 · 287 阅读 · 0 评论 -
netty系列之:使用Jboss Marshalling来序列化java对象
文章目录简介添加JBoss Marshalling依赖JBoss Marshalling的使用总结简介在JAVA程序中经常会用到序列化的场景,除了JDK自身提供的Serializable之外,还有一些第三方的产品可以实现对JAVA对象的序列化。其中比较有名的就是Google protobuf。当然,也有其他的比较出名的序列化工具,比如Kryo和JBoss Marshalling。今天想给大家介绍的就是JBoss Marshalling,为什么要介绍JBoss Marshalling呢?用过googl原创 2022-05-18 16:16:50 · 315 阅读 · 0 评论 -
netty系列之:netty中常用的对象编码解码器
文章目录简介什么是序列化重构序列化对象序列化不是加密使用真正的加密使用代理Serializable和Externalizable的区别netty中对象的传输ObjectEncoderObjectDecoderObjectEncoderOutputStream和ObjectDecoderInputStream总结简介我们在程序中除了使用常用的字符串进行数据传递之外,使用最多的还是JAVA对象。在JDK中,对象如果需要在网络中传输,必须实现Serializable接口,表示这个对象是可以被序列化的。这样就可原创 2022-05-17 13:56:59 · 985 阅读 · 0 评论 -
netty系列之:netty中常用的xml编码解码器
文章目录简介XmlFrameDecoderXmlDecoder总结简介在json之前,xml是最常用的数据传输格式,虽然xml的冗余数据有点多,但是xml的结构简单清晰,至今仍然运用在程序中的不同地方,对于netty来说自然也提供了对于xml数据的支持。netty对xml的支持表现在两个方面,第一个方面是将编码过后的多个xml数据进行frame拆分,每个frame包含一个完整的xml。另一方面是将分割好的frame进行xml的语义解析。进行frame拆分可以使用XmlFrameDecoder,进行x原创 2022-05-13 14:09:17 · 719 阅读 · 0 评论 -
netty系列之:netty中常用的字符串编码解码器
文章目录简介netty中的字符串编码解码器不同平台的换行符字符串编码的实现总结简介字符串是我们程序中最常用到的消息格式,也是最简单的消息格式,但是正因为字符串string太过简单,不能附加更多的信息,所以在netty中选择的是使用byteBuf作为最底层的消息传递载体。虽然底层使用的ByteBuf,但是对于程序员来说,还是希望能够使用这种最简单的字符串格式,那么有什么简单的方法吗?netty中的字符串编码解码器为了解决在netty的channel中传递字符串的问题,netty提供了针对于字符串的编原创 2022-05-12 16:10:59 · 1377 阅读 · 0 评论 -
java高级用法之:绑定CPU的线程Thread-Affinity
文章目录简介Java Thread Affinity简介AffinityLock的使用使用API直接分配CPU总结简介在现代计算机系统中,可以有多个CPU,每个CPU又可以有多核。为了充分利用现代CPU的功能,JAVA中引入了多线程,不同的线程可以同时在不同CPU或者不同CPU核中运行。但是对于JAVA程序猿来说创建多少线程是可以自己控制的,但是线程到底运行在哪个CPU上,则是一个黑盒子,一般来说很难得知。但是如果是不同CPU核对同一线程进行调度,则可能会出现CPU切换造成的性能损失。一般情况下这种损原创 2022-05-11 15:36:45 · 384 阅读 · 0 评论 -
java高级用法之:JNA中的回调
文章目录简介JNA中的Callbackcallback的应用callback的定义callback的获取和应用在多线程环境中使用callback总结简介什么是callback呢?简单点说callback就是回调通知,当我们需要在某个方法完成之后,或者某个事件触发之后,来通知进行某些特定的任务就需要用到callback了。最有可能看到callback的语言就是javascript了,基本上在javascript中,callback无处不在。为了解决callback导致的回调地狱的问题,ES6中特意引入了原创 2022-05-10 14:35:43 · 1191 阅读 · 0 评论 -
java高级用法之:JNA中的Structure
文章目录简介native中的structStructure特殊类型的Structure结构体数组作为参数结构体数组作为返回值结构体中的结构体结构体中的数组结构体中的可变字段结构体中的只读字段总结简介前面我们讲到了JNA中JAVA代码和native代码的映射,虽然可以通过TypeMapper来将JAVA中的类型和native中的类型进行映射,但是native中的数据类型都是基础类型,如果native中的数据类型是复杂的struct类型该如何进行映射呢?不用怕,JNA提供了Structure类,来帮助我们原创 2022-05-09 16:27:34 · 2750 阅读 · 0 评论 -
java高级用法之:JNA中的Function
文章目录简介function的定义Function的实际应用总结简介在JNA中,为了和native的function进行映射,我们可以有两种mapping方式,第一种是interface mapping,第二种是direct mapping。虽然两种方式不同,但是在具体的方法映射中,我们都需要在JAVA中定义一个和native方法进行映射的方法。而这个JAVA中的映射在JNA中就是一个function。通过或者function对象,我们可以实现一些非常强大的功能,一起看看吧。function的定义原创 2022-05-06 14:11:14 · 496 阅读 · 0 评论 -
java高级用法之:JNA中的Memory和Pointer
文章目录简介Pointer特殊的Pointer:OpaqueMemory总结简介我们知道在native的代码中有很多指针,这些指针在JNA中被映射成为Pointer。除了Pointer之外,JNA还提供了更加强大的Memory类,本文将会一起探讨JNA中的Pointer和Memory的使用。PointerPointer是JNA中引入的类,用来表示native方法中的指针。大家回想一下native方法中的指针到底是什么呢?native方法中的指针实际上就是一个地址,这个地址就是真正对象的内存地址。所原创 2022-05-05 14:14:11 · 1244 阅读 · 0 评论 -
网络协议之:Domain name service DNS详解
文章目录简介DNS的功能DNS的组成域名空间Domain name spaceName serversDNS的工作流程DNS资源记录DNS消息的结构总结简介现在是互联网的世界,大家从各种网站中获取各类资源和信息,通常我们只需要牢记一个网站地址即可,至于这个网站后台的服务器在什么地方,我们并不需要关心。当我们的请求指向这个网址之后,接下来就只需要等待请求被转发到该网址的后端服务器上,得到返回的处理结果即可。这个将网站名称解析成为服务IP地址的服务就是DNS服务,它的全称是Domain Name Syst原创 2022-04-29 13:53:01 · 955 阅读 · 0 评论 -
netty系列之:netty中的frame解码器
文章目录简介LineBasedFrameDecoderDelimiterBasedFrameDecoderFixedLengthFrameDecoderLengthFieldBasedFrameDecoder总结简介netty中的数据是通过ByteBuf来进行传输的,一个ByteBuf中可能包含多个有意义的数据,这些数据可以被称作frame,也就是说一个ByteBuf中可以包含多个Frame。对于消息的接收方来说,接收到了ByteBuf,还需要从ByteBuf中解析出有用而数据,那就需要将ByteBu原创 2022-04-28 13:53:12 · 1204 阅读 · 0 评论 -
netty系列之:netty中的自动解码器ReplayingDecoder
文章目录简介ByteToMessageDecoder可能遇到的问题ReplayingDecoder的实现原理总结简介netty提供了一个从ByteBuf到用户自定义的message的解码器叫做ByteToMessageDecoder,要使用这个decoder,我们需要继承这个decoder,并实现decode方法,从而在这个方法中实现ByteBuf中的内容到用户自定义message对象的转换。那么在使用ByteToMessageDecoder的过程中会遇到什么问题呢?为什么又会有一个Replaying原创 2022-04-27 13:51:21 · 1378 阅读 · 0 评论 -
netty系列之:netty中的核心解码器json
文章目录简介java中对json的支持netty对json的解码总结简介程序和程序之间的数据传输方式有很多,可以通过二进制协议来传输,比较流行的像是thrift协议或者google的protobuf。这些二进制协议可以实现数据的有效传输,并且通过二进制的形式可以节省数据的体积,在某些速度和效率优先的情况下是非常有效的。并且如果不同的编程语言之间的相互调用,也可以通过这种二进制的协议来实现。虽然二进制更加快速和有效,但是对于程序员来说不是很友好,因为一个人很难直接读取二进制文件,虽然也存在一些一些文本的原创 2022-04-26 13:56:05 · 1514 阅读 · 0 评论 -
netty系列之:netty中的核心编码器bytes数组
文章目录简介byte是什么netty中的byte数组的工具类netty中byte的编码器总结简介我们知道netty中数据传输的核心是ByteBuf,ByteBuf提供了多种数据读写的方法,包括基本类型和byte数组的读写方法。如果要在netty中传输这些数据,那么需要构建ByteBuf,然后调用ByteBuf中对应的方法写入对应的数据,接着套用netty中标准的模板即可使用。对于byte数组来说,如果每次都将其封装进ByteBuf中,再进行传输显得有些麻烦。于是netty提供了一个基于bytes的核心原创 2022-04-25 13:50:14 · 2131 阅读 · 0 评论 -
netty系列之:netty中的核心编码器base64
文章目录简介netty codec的实现逻辑netty中Base64的实现netty中的base64编码和解码器Base64EncoderBase64Decoder总结简介我们知道数据在netty中传输是以ByteBuf的形式进行的,可以说ByteBuf是netty的数据传输基础。但是对于现代的应用程序来说,通常我们需要用到其他的数据结构或者类型。为了方便我们在程序中的编写,一种方式就是在将数据传入到netty中的时候由程序员自身将数据格式进行转换,然后再调用netty的系统方法。另外一种方式就是定义原创 2022-04-22 14:07:38 · 601 阅读 · 0 评论 -
netty系列之:netty中的核心MessageToByte编码器
文章目录简介MessageToByte框架简介MessageToByteEncoderByteToMessageDecoderByteToMessageCodec总结简介之前的文章中,我们讲解了netty中从一个message转换成为另外一个message的框架叫做MessageToMessage编码器。但是message to message只考虑了channel中消息在处理过程中的转换,但是我们知道channel中最终传输的数据一定是ByteBuf,所以我们还需要一个message和ByteBuf相原创 2022-04-20 15:21:18 · 1203 阅读 · 0 评论 -
netty系列之:netty中的核心MessageToMessage编码器
文章目录简介框架简介MessageToMessageEncoderMessageToMessageDecoderMessageToMessageCodec总结简介在netty中我们需要传递各种类型的消息,这些message可以是字符串,可以是数组,也可以是自定义的对象。不同的对象之间可能需要互相转换,这样就需要一个可以自由进行转换的转换器,为了统一编码规则和方便用户的扩展,netty提供了一套消息之间进行转换的框架。本文将会讲解这个框架的具体实现。框架简介netty为消息和消息之间的转换提供了三个类原创 2022-04-18 13:56:52 · 1475 阅读 · 0 评论 -
java高级用法之:JNA类型映射应该注意的问题
文章目录简介StringBuffers,Memory,数组和Pointer可变参数总结简介JNA提供JAVA类型和native类型的映射关系,但是这一种映射关系只是一个大概的映射,我们在实际的应用中还有很多需要注意的事项,本文将会为大家详细讲解在使用类型映射中可能会出现的问题。一起来看看吧。String首先是String的映射,JAVA中的String实际上对应的是两种native类型:const char* 和 const wchar_t*。默认情况下String会被转换成为char* 。ch原创 2022-04-15 14:44:25 · 1995 阅读 · 0 评论 -
netty系列之:java中的base64编码器
文章目录简介JAVA对base64的支持JDK中Base64的分类和实现Base64的高级用法总结简介什么是Base64编码呢?在回答这个问题之前,我们需要了解一下计算机中文件的分类,对于计算机来说文件可以分为两类,一类是文本文件,一类是二进制文件。对于二进制文件来说,其内容是用二进制来表示的,对于人类是不可立马理解的。如果你尝试用文本编辑器打开二进制文件,可能会看到乱码。这是因为二进制文件的编码方式和文本文件的编码方式是不一样的,所以当文本编辑器尝试将二进制文件翻译成为文本内容的时候,就会出现乱码。原创 2022-04-08 18:06:33 · 1094 阅读 · 0 评论 -
网络协议之:socket协议详解之Unix domain Socket
文章目录简介什么是Unix domain Socket使用socat来创建Unix Domain Sockets使用ss命令来查看Unix domain Socket使用nc连接到Unix domain Socket服务总结简介之前的文章我们讲到了Socket中的Stream Socket和Datagram Socket,这两种Socket通常分别是基于tcp和udp协议来进行数据的传输。这两种Socket都有一个共同的特点,那就是需要一个IP地址和端口来建立客户端和服务器端的连接。那么今天我们会来讲原创 2022-04-06 15:04:43 · 5898 阅读 · 0 评论 -
netty系列之:netty中各不同种类的channel详解
文章目录简介ServerChannel和它的类型Epoll和KqueueAbstractServerChannelServerSocketChannelServerDomainSocketChannelSctpServerChannelChannel和它的类型UnixChannelSctpChannelDatagramChannelDomainDatagramChannelDuplexChannelAbstractChannel总结简介channel是连接客户端和服务器端的桥梁,在netty中我们最常用原创 2022-03-16 09:48:33 · 4948 阅读 · 1 评论 -
netty系列之:NIO和netty详解
文章目录简介NIO常用用法NIO和EventLoopGroupNioEventLoopGroupSelectorProviderSelectStrategyFactoryRejectedExecutionHandlerEventLoopTaskQueueFactoryNioEventLoop总结简介netty为什么快呢?这是因为netty底层使用了JAVA的NIO技术,并在其基础上进行了性能的优化,虽然netty不是单纯的JAVA nio,但是netty的底层还是基于的是nio技术。nio是JDK1.原创 2022-03-09 18:49:12 · 5861 阅读 · 1 评论 -
netty系列之:EventLoop,EventLoopGroup和netty的默认实现
文章目录简介EventLoopGroup和EventLoopEventLoopGroup在netty中的默认实现EventLoop在netty中的默认实现总结简介在netty中不管是服务器端的ServerBootstrap还是客户端的Bootstrap,在创建的时候都需要在group方法中传入一个EventLoopGroup参数,用来处理所有的ServerChannel和Channel中所有的IO操作和event。可能有的小伙伴还稍微看了一下netty的源码,可能会发现还有一个和EventLoopGr原创 2022-03-07 21:18:38 · 4096 阅读 · 1 评论 -
netty系列之:EventExecutor,EventExecutorGroup和netty中的实现
文章目录简介EventExecutorGroupEventExecutorEventExecutorGroup在netty中的基本实现EventExecutor在netty中的基本实现总结简介netty作为一个异步NIO框架,多线程肯定是它的基础,但是对于netty的实际使用者来说,一般是不需要接触到多线程的,我们只需要按照netty框架规定的流程走下去,自定义handler来处理对应的消息即可。那么有朋友会问了,作为一个NIO框架,netty的多线程到底体现在什么地方呢?它的底层原理是什么呢?今天原创 2022-03-04 13:51:09 · 6287 阅读 · 0 评论 -
netty系列之:channelHandlerContext详解
文章目录简介ChannelHandlerContext和它的应用AbstractChannelHandlerContextDefaultChannelHandlerContext总结简介我们知道ChannelHandler有两个非常重要的子接口,分别是ChannelOutboundHandler和ChannelInboundHandler,基本上这两个handler接口定义了所有channel inbound和outbound的处理逻辑。不管是ChannelHandler还是ChannelOutbou原创 2022-03-02 14:06:23 · 11895 阅读 · 1 评论 -
netty系列之:channelPipeline详解
文章目录简介ChannelPipeline事件传递DefaultChannelPipeline总结简介我们在介绍channel的时候提到过,几乎channel中所有的实现都是通过channelPipeline进行的,作为一个pipline,它到底是如何工作的呢?一起来看看吧。ChannelPipelineChannelPipeline是一个interface,它继承了三个接口,分别是ChannelInboundInvoker,ChannelOutboundInvoker和Iterable:pub原创 2022-02-28 18:36:44 · 7595 阅读 · 1 评论 -
netty系列之:channel,ServerChannel和netty中的实现
文章目录简介channel和ServerChannelnetty中channel的实现AbstractChannel和AbstractServerChannelLocalChannel和LocalServerChannel总结简介我们知道channel是netty中用于沟通ByteBuf和Event的桥梁,在netty服务的创建过程中,不管是客户端的Bootstrap还是服务器端的ServerBootstrap,都需要调用channel方法来指定对应的channel类型。那么netty中channel原创 2022-02-22 10:58:17 · 6556 阅读 · 0 评论 -
netty系列之:Bootstrap,ServerBootstrap和netty中的实现
文章目录简介Bootstrap和ServerBootstrap的联系AbstractBootstrapBootstrap和ServerBootstrap总结简介虽然netty很强大,但是使用netty来构建程序却是很简单,只需要掌握特定的netty套路就可以写出强大的netty程序。每个netty程序都需要一个Bootstrap,什么是Bootstrap呢?Bootstrap翻译成中文来说就是鞋拔子,在计算机世界中,Bootstrap指的是引导程序,通过Bootstrap可以轻松构建和启动程序。在ne原创 2022-02-21 21:32:09 · 4337 阅读 · 1 评论 -
netty系列之:可以自动通知执行结果的Future,有见过吗?
文章目录简介JDK异步缘起netty中的ExecutorFuture的困境和netty的实现总结简介在我的心中,JDK有两个经典版本,第一个就是现在大部分公司都在使用的JDK8,这个版本引入了Stream、lambda表达式和泛型,让JAVA程序的编写变得更加流畅,减少了大量的冗余代码。另外一个版本要早点,还是JAVA 1.X的时代,我们称之为JDK1.5,这个版本引入了java.util.concurrent并发包,从此在JAVA中可以愉快的使用异步编程。虽然先JDK已经发展到了17版本,但是并发原创 2022-02-18 19:13:40 · 3536 阅读 · 0 评论 -
netty系列之:channel和channelGroup
文章目录简介神龙见首不见尾的channelchannel和channelGroupchannelGroup的基本使用将关闭的channel自动移出同时关闭serverChannel和acceptedChannelChannelGroupFuture总结简介channel是netty中数据传输和数据处理的渠道,也是netty程序中不可或缺的一环。在netty中channel是一个接口,针对不同的数据类型或者协议channel会有具体的不同实现。虽然channel很重要,但是在代码中确实很神秘,基本上我们原创 2022-02-17 21:32:22 · 6385 阅读 · 0 评论 -
netty系列之:不用怀疑,netty中的ByteBuf就是比JAVA中的好用
文章目录简介ByteBuf和ByteBuffer的可扩展性不同的使用方法性能上的不同总结简介netty作为一个优秀的的NIO框架,被广泛应用于各种服务器和框架中。同样是NIO,netty所依赖的JDK在1.4版本中早就提供nio的包,既然JDK已经有了nio的包,为什么netty还要再写一个呢?不是因为JDK不优秀,而是因为netty的要求有点高。ByteBuf和ByteBuffer的可扩展性在讲解netty中的ByteBuf如何优秀之前,我们先来看一下netty中的ByteBuf和jdk中的By原创 2022-02-16 18:41:25 · 4192 阅读 · 0 评论 -
netty系列之:让TCP连接快一点,再快一点
文章目录简介TCP fast open开启TFOnetty对TFO的支持总结简介经典的TCP三次握手大家应该很熟悉了,三次握手按道理说应该是最优的方案了,当然这是对于通用的情况来说的。那么在某些特殊的情况下是不是可以提升TCP建立连接的速度呢?答案是肯定的,这就是今天我们要讲的TCP fast open和netty。TCP fast open什么是TCP fast open呢?TCP fast open也可以简写为TFO,它是TCP协议的一种扩展。为什么是fast open呢?这是因为TFO可以原创 2022-02-15 18:14:36 · 4052 阅读 · 1 评论 -
netty系列之:JVM中的Reference count原来netty中也有
文章目录简介ByteBuf和ReferenceCountedByteBuf的基本使用ByteBuf的回收ByteBuf的衍生方法ChannelHandler中的引用计数内存泄露总结简介为什么世界上有这么多JAVA的程序员呢?其中一个很重要的原因就是JAVA相对于C++而言,不需要考虑对象的释放,一切都是由垃圾回收器来完成的。在崇尚简单的现代编程世界中,会C++的高手越来越少,会JAVA的程序员越来越多。JVM的垃圾回收器中一个很重要的概念就是Reference count,也就是对象的引用计数,用来控原创 2022-02-14 17:25:47 · 2432 阅读 · 0 评论 -
netty系列之:真正的平等–UDT中的Rendezvous
文章目录简介建立支持Rendezvous的服务器处理不同的消息节点之间的交互总结简介在我们之前提到的所有netty知识中,netty好像都被分为客户端和服务器端两部分。服务器端监听连接,并对连接中的消息进行处理。而客户端则向服务器端建立请求连接,从而可以发送消息。但是这一切都要在UDT协议中被终结,因为UDT提供了Rendezvous,一种平等的连接类型,节点之间是对等关系。从来都没有救世主,也没有神仙和皇帝,只有同为节点的好兄弟。建立支持Rendezvous的服务器因为是对等的关系,所以这里不原创 2022-02-11 10:13:13 · 3705 阅读 · 0 评论