文档章节

Netty随笔1

袁璞
 袁璞
发布于 2015/08/10 10:22
字数 454
阅读 19
收藏 0

Netty Server监听用的是, NioServerSocketChannel, 客户端链接用的是NioSocketChannel。继承关系如下

AbstractNioChannel 

-> AbstractNioMessageChannel -> ... NioServerSocketChannel

-> AbstractNioByteChannel -> NioSocketChannel

这两个Channel的基类,一个是AbstractNioMessageChannel就是已经将byte流解析为一个List<Object>, 而另一个AbstractNioByteChannel则是直接将Byte数组传递过去。

NioServerSocketChannel 中,每当新建一个链接,其实都是在Read方法中,生成一个新的NioSocketChannel。所以其实NioServerSocketChannel只是负责监听的Channel,具体到每一个链接,仍然是NioSocketChannel。

如果我们想要控制服务器的链接数量,完全可以在NioServerSocketChannel的doReadMessages里面做些文章

    @Override

    protected int doReadMessages(List<Object> buf) throws Exception {

        int result = super.doReadMessages(buf);

        if (result > 0) {

            //success, 这里已经将byte数组转化为一个List<Object>,并且唯一的成员就是新建的链接

            NioSocketChannel channel = (NioSocketChannel) buf.get(0);

            .....

            if (拒绝链接) {

                channel.close();

                return 0;

            }

       }

        return result; 

}

而ByteToMessageDecoder, 通常是我们的协议实现层,会将byte数组转化为一个List<Object>, 然后调用read方法直接对Object进行处理,每个Object,都会调用一次read方法。

由于可能多次read, 读取多个byte才能生成一个List<Object>, 所以并不是read方法每次读取都会被调用,因此使用ByteToMessageDecoder我们会观察到readComplete被调用(每次读取字节都会触发readComplete),但是read没有被调用的情形。

但是AbstractNioMessageChannel在这一点上与Decoder不同,这个Channel中,会在生成List<Object>之后,针对每个Object做循环调用,这一点与ByteToMessageDecoder相同,但是循环调用read之后,才会调用一次readComplete,这一点不同。此时readComplete的触发更为稀少。

















© 著作权归作者所有

袁璞
粉丝 8
博文 6
码字总数 4966
作品 0
东城
高级程序员
私信 提问
针对Vue的后台权限功能实现思路(持续更新)

权限是一块设计挺繁琐的功能,尤其是设计到前端SPA应用,前后端的耦合性太强,先屡屡思路,再实现,如果您有好的建议,也可评论留言。 基本的表结构如下 用户表。user 字段 说明 id 用户ID ...

赛冷思
2017/10/29
1K
0
知名出版社,诚招IT图书兼职作者(长期招聘)

知名出版社,诚招IT图书兼职作者(长期招聘) 我公司每年策划200本左右计算机应用,计算机开发类图书,同时也涉及用电脑炒股,手机/平板电脑深度应用,财务软件,会计,ERP等领域的书籍出版。常年需...

橙子_1123
2013/02/20
637
7
邮件代收代发功能模块的操作界面设计和阶段性总结

大约半年前,一个客户希望给他开发一个代收代发的功能模块,只需要一个后台的服务进行自动收取和发送邮件,因此我结合了我自己的定时服务程序,增加了一个基于Lumisoft组件的邮件发送和收取插...

walb呀
2017/12/04
0
0
C# WinForm开发系列 - Reporting Services

收集微软的SQL Reporting Services 在商务智能系统(BI)与数据挖掘方面开发应用以及安装配置文章, 并提供了相关开发资源的下载地址. Reporting Services初体验 报表服务教程1: 创建基本报表...

长征2号
2017/11/06
0
0
用java 调用elasticsearch 出现IllegalStateException

elasticsearch.log日志具体错误: 错误原因:

小湘西
2016/11/22
198
0

没有更多内容

加载失败,请刷新页面

加载更多

mysql-connector-java升级到8.0后保存时间到数据库出现了时差

在一个新项目中用到了新版的mysql jdbc 驱动 <dependency>     <groupId>mysql</groupId>     <artifactId>mysql-connector-java</artifactId>     <version>8.0.18</version> ......

ValSong
今天
5
0
Spring Boot 如何部署到 Linux 中的服务

打包完成后的 Spring Boot 程序如何部署到 Linux 上的服务? 你可以参考官方的有关部署 Spring Boot 为 Linux 服务的文档。 文档链接如下: https://docs.ossez.com/spring-boot-docs/docs/r...

honeymoose
今天
6
0
Spring Boot 2 实战:使用 Spring Boot Admin 监控你的应用

1. 前言 生产上对 Web 应用 的监控是十分必要的。我们可以近乎实时来对应用的健康、性能等其他指标进行监控来及时应对一些突发情况。避免一些故障的发生。对于 Spring Boot 应用来说我们可以...

码农小胖哥
今天
9
0
ZetCode 教程翻译计划正式启动 | ApacheCN

原文:ZetCode 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远。 ApacheCN 学习资源 贡献指南 本项目需要校对,欢迎大家提交 Pull Request。 ...

ApacheCN_飞龙
今天
5
0
CSS定位

CSS定位 relative相对定位 absolute绝对定位 fixed和sticky及zIndex relative相对定位 position特性:css position属性用于指定一个元素在文档中的定位方式。top、right、bottom、left属性则...

studywin
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部