文档章节

详谈ChannelGroup功能之一

一一叶
 一一叶
发布于 2015/04/24 00:16
字数 538
阅读 104
收藏 0
点赞 0
评论 0

我们一步步走进netty5的源码

首先我们来看一下源码中带的实例源码

这是SecureChat这个实例中的SecureChatServerHandler中的channelActive的相关代码,

其次:我们来观看这个实例重点代码

    1>, extends SimpleChannelInboundHandler

    2>,static final ChannelGroup channels = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);

    3>, channels.add(ctx.channel());

其他的暂且不论

然后:我们来详细分析

    第一条说明是收信息的,进pipeline进行处理的,

    第二条,先看GlobalEventExecutor.INSTANCE,在源码中package io.netty.util.concurrent包内GlobalEventExecutor类中,第41行    public static final GlobalEventExecutor INSTANCE = new GlobalEventExecutor();可以看得很明白了。我研究了一下他的源码大致意思是这个类主要是全局事件处理的

    再看new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);在源码io.netty.channel.groupbao中DefaultChannelGroup的第60行是一个有参构造

    第三条,可以很明白 的知道是一个集合

最后:我在深入DefaultChannelGroup的源码,我们重点看一下几点

    1>extends AbstractSet<Channel> implements ChannelGroup 在源码中42行

    2>    private static final AtomicInteger nextId = new AtomicInteger();在源码中第44行

    3>public DefaultChannelGroup(EventExecutor executor) {

        this("group-0x" + Integer.toHexString(nextId.incrementAndGet()), executor);

    }在源码中60行

    4>

    public DefaultChannelGroup(String name, EventExecutor executor) {

        if (name == null) {

            throw new NullPointerException("name");

        }

        this.name = name;

        this.executor = executor;

    }在源码69行

    5> private final ConcurrentMap<ChannelId, Channel> serverChannels =                     PlatformDependent.newConcurrentHashMap();

    private final ConcurrentMap<ChannelId, Channel> nonServerChannels =     PlatformDependent.newConcurrentHashMap();在源码47行

我们可以看出DefaultChannelGroup是一个AbstractSet集合,实现了ChannelGroup ,并且使用了原子integer----->  AtomicInteger  结合第三可以看出ChannelId 是有框架自动生成的,也可以定制。在源码中始终没有一个返回map的方法,想用的话可以自己定义一个,但DefaultChannelGroup中的每一个方法都跟map有关,都是在操作map

总结:我们知道ChannelId是自动生成的,可以定制,这是一个喜讯,我们可以把我们相关的userId绑定,为我们做服务,自己在DefaultChannelGroup定义一个定义一个也可以,本人不推荐自定义map,但推荐定制ChannelId



   




© 著作权归作者所有

共有 人打赏支持
一一叶
粉丝 25
博文 21
码字总数 8193
作品 0
浦东
高级程序员
netty channelgroup的广播信息,channel怎样获取??

代码: private ChannelGroup recipients; public CustomTextFrameHandler(ChannelGroup recipients) { this.recipients= recipients; } protected void channelRead0(ChannelHandlerContext......

菜菜菜鸟小凯 ⋅ 2014/07/02 ⋅ 0

netty websocket 简单消息推送demo

今天心情很不好!!! 原因保密。 这篇是基于"netty与websocket通信demo"。 错误想法:大量客户请求,共用一个worker,来实现推送。 正确作法:应该是对Channel对应的ChannelGroup进行操作,...

爱喝貓的咖啡 ⋅ 2014/11/03 ⋅ 4

采用mqtt协议实现即时通讯, 该如何设计topic?

一. 以下是我的逻辑, 请各位前辈,哥哥们帮忙看看. 是否可行. 有没有更好的方案? 点对点聊天, 可以让每个用户都有一个属于自己的topic. 每个用户上线了都订阅自己的topic. 下面假设有用户A,B...

plugin ⋅ 2016/01/31 ⋅ 2

Netty 实现 WebSocket 聊天功能

原文同步至 上一次我们用 Netty 快速实现了一个 Java 聊天程序(见)。现在,我们要坐下修改,加入 WebSocket 的支持,使它可以在浏览器里进行文本聊天。 准备 JDK 7+ Maven 3.2.x Netty 4.x...

waylau ⋅ 2015/03/26 ⋅ 19

Netty Channel 接口名词理解

1.Channel channel 是负责数据读,写的对象,有点类似于老的io里面的stream,他和stream的区别,channel是双向的 既可以write 也可以read,而stream要分outstream和inputstream。而且在NIO中...

linugb118 ⋅ 2010/11/12 ⋅ 0

Netty实现群聊

如题,只是为了实验,我将所有的客户端的channel存在静态变量ChannelGroup实例中,对消息进行群发。 当然,如果实际的环境中,我估计要将channel存在缓存数据库中,具体怎么做,后面再研究。...

扬州炒饭 ⋅ 2016/03/17 ⋅ 0

提供分布式存储和计算平台软件(已经成熟)

提供“分布式存储和计算”软件平台,已经成熟,并在多个项目中应用,专门为海量影像数据提供存储和计算支持,有存储虚拟化功能!如果需要可提供“源代码”,由于平台比较复杂,可提供半年或者...

比尔-强 ⋅ 2012/06/30 ⋅ 20

Netty 实现聊天功能

原文同步至 Netty 是一个 Java NIO 客户端服务器框架,使用它可以快速简单地开发网络应用程序,比如服务器和客户端的协议。Netty 大大简化了网络程序的开发过程比如 TCP 和 UDP 的 socket 服...

waylau ⋅ 2015/03/01 ⋅ 13

nodejs网页请求

今天做nodejs的http请求的时候,竟然报错了 list argument must be an array of buffers 我还是代码识别数值错误了呢,我还特意把nodejs去下载个新版本呢,原来的是6.9.1下了最新的6.10.1后进...

hongyi1159 ⋅ 2017/04/21 ⋅ 0

windows 客户端程序开发咨询

想咨询(外包)一个windows 云盘客户端开发,类似爱数云盘 主要内容如下: 1:嵌入在windows系统中,并模拟类似一个盘符的功能 2:系统上默认0k的文件,双击后会先下载然后打开 3:系统右侧有类...

anying ⋅ 2017/02/28 ⋅ 1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

服务网关过滤器

过滤器作用 我们的微服务应用提供的接口就可以通过统一的API网关入口被客户端访问到了。但是,每个客户端用户请求微服务应用提供的接口时,它们的访问权限往往都需要有一定的限制,系统并不会...

明理萝 ⋅ 5分钟前 ⋅ 1

【2018.06.21学习笔记】【linux高级知识 14.1-14.3】

14.1 NFS介绍 14.2 NFS服务端安装配置 14.3 NFS配置选项

lgsxp ⋅ 14分钟前 ⋅ 0

Day18 vim编辑模式、命令模式与练习

编辑模式 命令模式 :nohl 不高亮显示 :x与:wq类似,如果在更改文件之后操作,两者效果一样;如果打开文件,没有任何操作; :wq会更改mtime,但是:x不会。 练习题 扩展 vim的特殊用法 ht...

杉下 ⋅ 17分钟前 ⋅ 0

Enum、EnumMap、EnumSet

1、Enum 不带参数 public enum Car { AUDI { @Override public int getPrice() { return 25000; } }, MERCEDES { ......

职业搬砖20年 ⋅ 18分钟前 ⋅ 0

Java中的锁使用与实现

1.Lock接口 锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源。 在Lock出现之前,java程序是靠synchronized关键字实现锁功能的,而Java SE5之后,...

ZH-JSON ⋅ 19分钟前 ⋅ 0

线程组和 ThreadLocal

前言 在上面文章中,我们从源码的角度上解析了一下线程池,并且从其 execute 方法开始把线程池中的相关执行流程过了一遍。那么接下来,我们来看一个新的关于线程的知识点:线程组。 线程组 ...

猴亮屏 ⋅ 21分钟前 ⋅ 0

相对路径和绝对路径

基本概念   文件路径就是文件在电脑中的位置,表示文件路径的方式有两种,相对路径和绝对路径。在网页设计中通过路径可以表示链接,插入图像、Flash、CSS文件的位置。   物理路径:物理路...

临江仙卜算子 ⋅ 25分钟前 ⋅ 0

消息队列属性及常见消息队列介绍

什么是消息队列? 消息队列是在消息的传输过程中保存消息的容器,用于接收消息并以文件的方式存储,一个队列的消息可以同时被多个消息消费者消费。分布式消息服务DMS则是分布式的队列系统,消...

中间件小哥 ⋅ 27分钟前 ⋅ 0

java程序员使用web3j进行以太坊开发详解

如何使用web3j为Java应用或Android App增加以太坊区块链支持,教程内容即涉及以太坊中的核心概念,例如账户管理包括账户的创建、钱包创建、交易转账,交易与状态、智能合约开发与交互、过滤器...

笔阁 ⋅ 27分钟前 ⋅ 0

vim编辑模式、vim命令模式

vim编辑模式 使用vim filename 进入的界面是一般模式,在这个模式下虽然我们能够查看,复制,剪切,粘贴,但是不能编辑新的内容,如何能直接写入东西呢?这就需要进入编辑模式了,从一般模式...

李超小牛子 ⋅ 30分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部