范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

netty系列之netty中各不同种类的channel详解

  netty系列之:netty中各不同种类的channel详解
  文章目录 简介 ServerChannel和它的类型 Channel和它的类型 总结 简介
  channel是连接客户端和服务器端的桥梁,在netty中我们最常用的就是NIO,一般和NioEventLoopGroup配套使用的就是NioServerSocketChannel和NioSocketChannel,如果是UDP协议,那么配套使用的就是NioDatagramChannel,如果是别的协议还有其他不同的Channel类型。
  这些不同channel类型有什么区别呢?一个直观的感觉就是不同的channel和channel连接使用的协议有关系,不同的channel可能适配了不同的连接协议。
  事实到底是不是如此呢?在netty的内部实现中到底有多少种channel呢?今天一起来探讨一下。ServerChannel和它的类型
  虽然ServerChannel继承自Channel,但是ServerChannel本身并没有添加任何新的方法:public interface ServerChannel extends Channel {  }
  所以对ServerChannel和Channel来说都可以看做是Channel,他们只是语义上有区别。
  但是因为ServerChannel继承自Channel,所以相对的ServerChannel的分类和实现要比Channel要少。所以我们先以ServerChannel为例进行讲解。
  ServerChannel的实现也有很多,我们以Abstract*开头的实现为例,下面是他们的继承关系:
  从上图我们可以看出,ServerChannel有六个抽象类实现,分别是AbstractEpollServerChannel,AbstractKQueueServerChannel,AbstractServerChannel,ServerSocketChannel,SctpServerChannel和ServerDomainSocketChannel。
  其中前面三个抽象类同时继承自AbstractChannel。Epoll和Kqueue
  Epoll和Kqueue是两个独特的依赖于特定平台的NIO协议,其中epoll只在linux平台才支持,而kQueue则在FreeBSD、NetBSD、OpenBSD、macOS 等操作系统支持。
  我们来看下AbstractEpollServerChannel的构造函数:    protected AbstractEpollServerChannel(int fd) {         this(new LinuxSocket(fd), false);     }      AbstractEpollServerChannel(LinuxSocket fd) {         this(fd, isSoErrorZero(fd));     }      AbstractEpollServerChannel(LinuxSocket fd, boolean active) {         super(null, fd, active);     }
  所有的构造函数都需要一个LinuxSocket的参数,LinuxSocket是一个socket用来提供对于linux native方法的访问支持。
  同样的,我们再看一下AbstractKQueueServerChannel的构造函数:    AbstractKQueueServerChannel(BsdSocket fd) {         this(fd, isSoErrorZero(fd));     }      AbstractKQueueServerChannel(BsdSocket fd, boolean active) {         super(null, fd, active);     }
  AbstractKQueueServerChannel的构造函数需要传入一个BsdSocket参数,BsdSocket是一个类用来提供对BSD系统的本地方法的访问。AbstractServerChannel
  AbstractServerChannel我们在之前的channel一章中已经讲过了,它的唯一实现就是LocalServerChannel,用于本地的transport。ServerSocketChannel
  ServerSocketChannel是一个以Socket连接为基础的ServerChannel,既然是Socket连接,那么ServerSocketChannel中提供了一个InetSocketAddress类型的localAddress和一个remoteAddress, 另外还有一个ServerSocketChannelConfig属性,用来存储ServerSocketChannel相关的配置信息:public interface ServerSocketChannel extends ServerChannel {     @Override     ServerSocketChannelConfig config();     @Override     InetSocketAddress localAddress();     @Override     InetSocketAddress remoteAddress(); } ServerDomainSocketChannel
  ServerDomainSocketChannel是使用DomainSocket来进行通讯的ServerChannel。什么是DomainSocket呢?
  DomainSocket的全称是unix domain socket,它又可以叫做IPC socket,也就是inter-process communication socket,是在unix平台上的同一服务器上的进程通信方式。
  我们知道,协议是比较复杂的,对于传统的socket通讯来说,需要定制特定的协议,然后进行封包和解包等操作,但是使用DomainSocket,可以直接将进程的数据直接拷贝,从而节约了时间,并提高了程序的效率。
  DomainSocket的地址是一个文件的路径,实际上是下面的一个结构体:struct sockaddr_un {     sa_family_t     sun_family;     /* AF_UNIX ,2字节*/     char    sun_path[UNIX_PATH_MAX];        /* 路径名 */ };
  在ServerDomainSocketChannel中的remoteAddress和localAddress的类型都是DomainSocketAddress,DomainSocketAddress有一个socketPath属性,用来存储DomainSocket文件的路径。SctpServerChannel
  最后一个要讲解的ServerChannel是SctpServerChannel,Sctp的全称是Stream Control Transmission Protocol,他是一种类似于TCP/IP的协议。和SocketServerChannel一样,SctpServerChannel中也有一个config叫做SctpServerChannelConfig,还提供了多个bindAddress方法用来绑定InetAddress.
  有关Sctp协议的具体内容,本章不深入讨论,感兴趣的朋友可以关注后续的章节。Channel和它的类型
  Channel作为ServerChannel的父类,又有哪些实现呢?
  先来看下常用channel的实现类:
  看起来channel的实现类非常多,基本上都是按照channel中使用传输协议的类型来的。
  我们具体来看一下相应的实现类。UnixChannel
  UnixChannel表示的unix平台上的操作,它有一个fd方法,返回一个FileDescriptor:FileDescriptor fd();
  这也是unix和windows平台的区别之一,unix平台所有的一切都可以用文件来表示。SctpChannel
  在上面我讲SctpServerChannel的时候我们提过了,Sctp是一个类似于tcp/ip的协议,SctpChannel中定义了协议中需要使用到的localAddress和remoteAddress:InetSocketAddress localAddress();  InetSocketAddress remoteAddress();
  同时还定义了一些绑定方法:    ChannelFuture bindAddress(InetAddress var1);      ChannelFuture bindAddress(InetAddress var1, ChannelPromise var2);      ChannelFuture unbindAddress(InetAddress var1);      ChannelFuture unbindAddress(InetAddress var1, ChannelPromise var2);  DatagramChannel
  DatagramChannel用来处理UDP协议的连接,因为UDP有广播的功能,所以DatagramChannel中提供了joinGroup的方法,来join一个multicast group:ChannelFuture joinGroup(InetAddress multicastAddress);
  当然,可以join就可以leave,还有一些leaveGroup的方法:ChannelFuture leaveGroup(InetAddress multicastAddress);
  还可以block某些地址在给定的networkInterface上的广播:ChannelFuture block(             InetAddress multicastAddress, NetworkInterface networkInterface,             InetAddress sourceToBlock);
  这些方法都和UDP的特性是息息相关的。DomainDatagramChannel
  DomainDatagramChannel和之前提到的ServerDomainSocketChannel一样,都是使用的IPC内部进程通讯技术,直接进行进程的拷贝,免去了协议解析等步骤,提升了处理速度。DuplexChannel
  DuplexChannel从名字看就是一个双向的channel,duplex Channel有一个特点,就是channel的两边可以独立的关闭,所以有下面的方法:boolean isInputShutdown();  ChannelFuture shutdownInput();  boolean isOutputShutdown();  ChannelFuture shutdownOutput();
  DuplexChannel的是实现有很多种,比如常见的NIOSocketChannel,KQueueSocketChannel,EpollSocketChannel等。AbstractChannel
  另外一个channel的非常重要的子类就是AbstractChannel,AbstractChannel有三个非常重要的实现,分别是AbstractNioChannel,AbstractKQueueChannel和AbstractEpollChannel。
  这三个类使用的都是NIO技术,不同的是第一个使用的是select,后面两个使用的是平台独有的KQueue和Epoll技术。
  其中NIO又可以分为NioByteChannel和NioMessageChannel,KQueue和Epoll又可以分为StreamChannel和DatagramChannel。总结
  以上就是channel在netty中的基本实现和分类。后面我们会详解讲解具体的channel到底是如何实现的。本文已收录于 www.flydean.com
  最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!
  欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

全新换电体系将向全行业开放,蔚来NIOPower让加电比加油更便捷蔚来NIOPower已实现88。88场景下,加电比加油更变方便。在今年的蔚来NIOPowerDay上,蔚来汽车总裁秦力洪自豪地对外界宣布。让加电比加油更方便,是2018年蔚来开始搭华为陈春花事件,揭示了盗版书商的谣言生意链作者金德路本文图片均来源于网络通过对陈春花关于华为的各种评论解读,以及其与任正非交流细节的反复演绎和夸大,网络上诞生了一万余篇吸引眼球的夺睛文章,民间自媒体们获得了不菲的流量。前几比亚迪全球电动车销量超特斯拉表现让人印象深刻据英国金融时报网站7月5日报道,中国比亚迪股份有限公司在汽车销量方面已经超越埃隆马斯克的特斯拉汽车公司,成为了世界上最大的电动汽车制造商,这表明中国在该领域的优势地位正在不断提升。华中科技大学国家脉冲强磁场科学中心从跟跑到超越强磁场是物质微观世界的放大镜,对提升我国前沿基础科学研究推动关键技术变革意义重大。作为世界四大脉冲强磁场科学中心之一,华中科技大学国家脉冲强磁场中心在党员科研突击队的引领攻坚下,短小米12SUltra补货了!还是5999起昨天炒到7000小米12SUltra补货了,今天上午首销后马上售罄一货难求,冷杉绿配色也是非常紧俏,昨晚一度炒到了7500元,而且还一货难求,而小米正式补货了两款颜色,价格依然是首发价5999起,第04篇Mybatis代理对象生成一架构分析Mybatis中Mapper一般只是一个接口,那么为什么能执行数据操作的呢?那肯定是基于代理没得说。在了解Mybatis如何实现代理前,我们先大概看下它的架构是什么样的,余秀华回应被男友抽上百耳光与易烊千玺胡先煦考进国家话剧院名人的爱情与事业,就是我们眼中楚门的世界。Y查乐干货时间到1。名人的爱情,当初有多美好,现在就有多糟糕。他们是楚门的世界,他们是我们眼中的俗世爱情吗?不。吃瓜群众是我们,但是清醒一weChat朋友圈文案1。爱在夏天不爱也在夏天。2。你所怀念的会有回音吗?3。减少没必要的倾诉和表达欲。4。过去的不重要重要的是现在。5。一切都会慢慢好起来的。6。要是爱能勇敢就好了。7。靠移动设备连接20年后泰坦女主和小李子再见,开心笑成少女,曾因肥胖被导演诋毁01hr在一次活动上,泰坦尼克号的女主,凯特温斯莱特很意外的看到了剧中饰演男主的小李子,她很惊讶地张大嘴巴,捂着嘴,两个人就开心大笑走在一起虽然两个人在那之后几乎没有什么合作,但是微信朋友圈七不晒,晒了尽量删掉!愿你不在其中迄今为止,中国已经经历了两次不同的造富,体制造富创造了大量商业机会,一些人打破体制开始下海,从事一些赚钱能力强大的行业产业造就了大量富豪,传统的制造业房地产业在很大程度上推进了中国适合发朋友圈的治愈文案91解不开的心结,就把它系成蝴蝶结吧。2喜欢日落,当黄昏落在身上,没有烟火,没有杂尘,只有光和希望。3落叶之秋,微风徐来,所有美好不期而遇。4慢慢来会有人拿着鲜花匆匆忙忙满心欢喜朝你
荒野的召唤垂钓者评测优哉游哉的钓鱼观光之旅本作是由知名步行模拟器猎人荒野的召唤的制作组开发的野钓游戏,将于2022年8月31日上架Steam和Epic。制作组精心设计了一望无际而又风景优美的自然保护区,玩家可在其中驾驶越野早晨空腹喝水,比不吃早餐危害大?医生说出答案,早了解早受益在平时我们常说,水是生命之源,在地球上,哪里有水,哪里就有生命。人体内的水分大约占到体重的65,人体一旦缺水,后果是非常严重的,缺水12,会感觉到口渴,缺水5,会出现口干舌燥,皮肤接受中国男篮的平庸,着眼未来8月29日,中国男篮8067战胜巴林,完成了第四个窗口期的比赛。就这两场世预赛的表现来看,中国男篮状态一般,没有达到大家的预期,结果还算圆满。也许是我们要求太高,一直把08奥运的中中国金花爆冷出局!被17岁少女横扫4比2后连丢4局,赛后伤心落泪郑钦文强势晋级的背后,是王欣瑜含泪出局。面对资格赛突围的17岁少女弗吕维尔托娃,王欣瑜表现不佳,全场失误不断的她被对手直落2盘横扫,无缘晋级下一轮。赛后接受采访时,她直接伤心落泪。告别中国男篮!沈梓捷怒砍0分,成为水货中锋,太让人失望当中国男篮结束了这个夏天比赛任务的时候,对于一些球员来说他们的国家队生涯恐怕也已经到了尽头,首当其冲的就是沈梓捷。作为一直被看好的中锋,在与巴林的比赛中他出场4分钟就五犯离场,怒砍北爱赛丁俊晖率中国八人进正赛2022年斯诺克北爱尔兰公开赛资格赛已经全部结束,在最后两个比赛日,田鹏飞和庞俊旭分别以40和42的比分战胜对手。丁俊晖率领八位中国球员进入正赛。丁俊晖中国球员田鹏飞面对伯恩斯,状20完胜!中国网球一姐再创历史,人民日报央视祝贺好样的北京时间8月30日,针对美网公开赛的赛况,国内媒体新浪体育进行了跟踪报道,他们表示在女单首轮争夺中,中国球员张帅以2比0完胜赛会30号种子瑞士球员泰希曼晋级,而这样的结果也引来很多1962年,玛丽莲梦露穿水钻礼服,为美国总统庆生如果我是一个循规蹈矩的人,那此刻我将会是一事无成。这是上世纪50年代,美国知名女影星玛丽莲梦露的一句名言。从这句话也可以感受到,梦露对事业的渴望,足以让她舍弃一切。1926年6月1王思聪退出万达集团董事8月31日,记者从企查查APP查询到,大连万达集团股份有限公司近日发生工商变更,王思聪退出董事职务。企查查信息显示,目前大连万达集团股份有限公司由大连合兴投资有限公司王健林共同持股如今房贷利率已降到4。46。3买房的人怎么办?引言可偏偏房子对中国人来说又有着特殊的重要性,房子除了可以解决大家的居住问题以外,也是结婚养老教育等所需的重要因素。不过这种房价高涨买房难的局面在去年出现了久违的好转,在这一年不仅南方电网孟振平充电网络明年将覆盖南方区域所有乡镇21世纪经济报道记者左茂轩,实习生汪青北京报道当今世界新一轮科技革命和产业变革正在蓬勃发展,在碳达峰碳中和战略目标下,能源电力行业正在发生深刻调整,加快绿色转型。汽车产业正加速向电