io.netty.channel.Channel是Netty网络操抽象类,它聚合了一组功能,包括但不限于网络的读、写,客户端发起连接,主动关闭连接,链路关闭,获取通信双方的网络地址等。它也包含了Netty框架相关的一些功能框架,包括获取该Channel的EventLoop,获取缓冲分配器ByteBufAllocator和pipeline等。
Channel网络I/O相关的方法定义:
Unsafe接口是Channel的一个内部接口,不应该被用户调用。
Channel需要注册到EventLoop的多路复用器上,用于处理I/O事件,通过eventLoop方法中以获取到Channel注册的EventLoop。EventLoop本质上就是处理网络读写事件的Reactor线程。在Netty中,它不仅仅用来处理网络事件,也可以用来执行定时任务和用户自定义NioTask等任务 。
通过metadata()方法和来获取当前Channel的TCP参数配置
对于服务端的Channel而言,它的父Channel为空。对于客户端Channel,它的父Channel是创建它的ServerSocketChannel
用来获取Channel标识,生成策略可能是: - 机器的MAC地址 - 当前的进程ID - 当前系统时间的毫秒 - 当前系统时间纳秒数 - 32位的随机整形数 - 32位自增的序列数
AttributeMap是绑定在Channel或者ChannelHandlerContext上的一个附件。 ChannelHandlerContext都是ChannelHandler和ChannelPipeline之间连接的桥梁, 每一个ChannelHandlerContext都有属于自己的上下文, 每一个ChannelHandlerContext上如果有AttributeMap都是绑定上下文的, A的ChannelHandlerContext中的AttributeMap,B的ChannelHandlerContext是无法读取到的。 但是Channel上的AttributeMap是共享的,每一个ChannelHandler都能获取到。
定义
public static final AttributeKey<NettyChannel> NETTY_CHANNEL_KEY = AttributeKey.valueOf("netty.channel");示例这里的AttributeMap中存储NettyChannel
package com.lyncc.netty.attributeMap; import java.util.Date; public class NettyChannel { private String name; private Date createDate; public NettyChannel(String name,Date createDate) { this.name = name; this.createDate = createDate; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Date getCreateDate() { return createDate; } public void setCreateDate(Date createDate) { this.createDate = createDate; } }使用
@Override public void channelActive(ChannelHandlerContext ctx) { Attribute<NettyChannel> attr = ctx.attr(NETTY_CHANNEL_KEY); NettyChannel nChannel = attr.get(); if (nChannel == null) { NettyChannel newNChannel = new NettyChannel("HelloWorld0Client", new Date()); nChannel = attr.setIfAbsent(newNChannel); } else { System.out.println("attributeMap 中是有值的"); System.out.println(nChannel.getName() + "=======" + nChannel.getCreateDate()); } System.out.println("HelloWorldC0ientHandler Active"); ctx.fireChannelActive(); }被Bootstrap引导的NioSocketChannel在构造好之后就进入了open状态,之后通过把自己注册进EventLoop进入registered状态,接着连接服务器进入active状态。
查询状态的方法: 1. isOpen() 2. isRegistered() 3. isActive() 4. isWriteable()
本文参考: http://blog.csdn.net/linuu/article/details/51502136 http://blog.csdn.net/zxhoo/article/details/17964353
新闻热点
疑难解答