文档章节

详谈ChannelGroup功能之一

一一叶
 一一叶
发布于 2015/04/24 00:16
字数 538
阅读 151
收藏 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
1K
0
netty websocket 简单消息推送demo

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

爱喝貓的咖啡
2014/11/03
0
4
采用mqtt协议实现即时通讯, 该如何设计topic?

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

plugin
2016/01/31
5.1K
2
Netty 实现 WebSocket 聊天功能

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

waylau
2015/03/26
0
19
Netty Channel 接口名词理解

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

linugb118
2010/11/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Linux命令备忘录: jobs 显示Linux中的任务列表及任务状态命令

jobs命令用于显示Linux中的任务列表及任务状态,包括后台运行的任务。该命令可以显示任务号及其对应的进程号。其中,任务号是以普通用户的角度进行的,而进程号则是从系统管理员的角度来看的...

开元中国2015
45分钟前
1
0
springboot Whitelabel Error Page(Not Found)解决方案

当出现上图图的错误时注意 报错信息 There was an unexpected error (type=Not Found, status=404). Not Found代表未访问到资源 解决方案:比较访问路径和代码的路径有没有写错 正确的访问路...

斩神魂
45分钟前
1
0
记一次hbase master停止服务的原因以及恢复

在Hdfs空间不足的情况下,拒绝写入,hbase会down掉。如果hdfs空间没有清理的情况下,重新启动hbase,会报splitlog失败,原因是wal日志重写过程中会写hdfs,写不进去导致的。重启不成功。 解决...

PageYi
49分钟前
1
0
如何从平面设计转行到UI设计?

时代的变迁,科技的进步,工具的发展,薪资的差距,促使许多人转行的原因,但平面与界面两者之间有着哪些的差异呢?如果,想要转行又该具备哪些条件呢? 平面、界面设计之间的差异性 平面设计...

mo311
52分钟前
4
0
线程池整理

一般在生产环境中,我们都不会直接new一个Thread,然后再去start(),因为这么做会不断频繁的创建线程,销毁线程,过大的线程会耗尽CPU和内存资源,大量的垃圾回收,也会给GC带来压力,延长GC停顿时间...

算法之名
53分钟前
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部