文档章节

详谈ChannelGroup功能之一

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

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

爱喝貓的咖啡
2014/11/03
0
4
兄弟连区块链教程Fabric1.0源代码分析configtx#ChannelConfig

Fabric 1.0源代码笔记 之 configtx(配置交易) #ChannelConfig(通道配置) 1、ChannelConfig概述 ChannelConfig代码分布在common/config目录下。目录结构如下: channel_util.go,channel...

兄弟连区块链入门教程
10/29
0
0
采用mqtt协议实现即时通讯, 该如何设计topic?

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

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

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

waylau
2015/03/26
0
19

没有更多内容

加载失败,请刷新页面

加载更多

GO redis 相关操作

在gopath 目录下安装 go get github.com/garyburd/redigo/redis package mainimport ("fmt""github.com/garyburd/redigo/redis")//定义一个全局链接池变量var pool *redis.Pool//......

汤汤圆圆
31分钟前
6
0
java8性特性,常用的lambda表达式

1、抽取多个对象中的某个属性,用数组接收 List<Student> students = new ArrayList<>(); List<String> names =students.stream().map(Student::getName).collect(Collectors.toList()); 2、......

Boss-x
32分钟前
7
0
flutter 子组件与父组件

无论是子组件还是父组件,任何时候initState()只执行一次,如果需要判断 就在build里面进行,不然无效的。

大灰狼wow
34分钟前
4
0
Rancher Labs引入全球首个多集群、多租户的Prometheus支持!

近日,Rancher Labs宣布加强对Prometheus的支持,提高Kubernetes集群的可见度。Rancher也因此成为唯一一个在多集群、多租户环境中支持Prometheus的解决方案。 Prometheus正迅速成为监控云原生...

RancherLabs
37分钟前
3
0
vue项目中api接口管理总结

默认vue项目中已经使用vue-cli生成,安装axios,基于element-ui开发,axiosconfig目录和api目录是同级,主要记录配置的相关。 1. 在axiosconfig目录下的axiosConfig.js import Vue from 'vue...

peakedness丶
39分钟前
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部