下文将剖析ServerBootstrap.bindAsync()方法所涉及到的流程。
1.概念
ChannelHandler分ChannelUpstreamHandler和ChanneldownstreamHandler,前者指向服务器接收事件的调用处理器,后者是服务器由内而外发送事件的事件处理器。
上下行消息传递方法介绍
sendUpstream()方法表发由外向内传递事件,
public void sendUpstream(ChannelEvent e) {
DefaultChannelHandlerContext head = getActualUpstreamContext(this.head);
if (head == null) {
if (logger.isWarnEnabled()) {
logger.warn(
"The pipeline contains no upstream handlers; discarding: " + e);
}
return;
}
sendUpstream(head, e);
}
void sendUpstream(DefaultChannelHandlerContext ctx, ChannelEvent e) {
try {
((ChannelUpstreamHandler) ctx.getHandler()).handleUpstream(ctx, e);
} catch (Throwable t) {
notifyHandlerException(e, t);
}
}
从处理器链最远的Head开始调用handleUpstream()方法。
sendDownstream方法负责从最里面开始向外发送事件。
public void sendDownstream(ChannelEvent e) {
DefaultChannelHandlerContext tail = getActualDownstreamContext(this.tail);
if (tail == null) {
try {
getSink().eventSunk(this, e);
return;
} catch (Throwable t) {
notifyHandlerException(e, t);
return;
}
}
sendDownstream(tail, e);
}
void sendDownstream(DefaultChannelHandlerContext ctx, ChannelEvent e) {
if (e instanceof UpstreamMessageEvent) {
throw new IllegalArgumentException("cannot send an upstream event to downstream");
}
try {
((ChannelDownstreamHandler) ctx.getHandler()).handleDownstream(ctx, e);
} catch (Throwable t) {
e.getFuture().setFailure(t);
notifyHandlerException(e, t);
}
}
sendDownstream依次从内向外沿着处理器链进行传递,直到最后传递给ChannelSink,这个类是处理接收处理终端的下行事件。
bind操作分析:
1.新建事件处理器SimpleChannelUpstreamHandler子类binder,负责在收到Open事件后发出bind请求。
2.新建ChannelPipeline类bossPipeline,并将binder和parentHandler(如果有,用户指定处理器)依次添加到bossPipeline末尾
3.利用NioServerSocketChannelFactory,以bossPipeline为参数创建Channel。在其中的构造函数中
3.1.ServerSocketChannel.open();打开socket
3.2.fireChannelOpen()中channel.getPipeline().sendUpstream发送上行消息OPEN状态事件,以此事件为起始引发后续bind操作。
4.OPEN事件传递到binder后会调用其channelOpen()方法,该方法设置了相关Option,继续传递OPEN事件到下一个处理器parentHandler。最后调用channel.bind()方法绑定localAddress。
5.该绑定方法会调用sendDownstream()方法向下行流传递BOUND状态事件。binder为上行流处理器,忽略,parentHandler如果是对应处理器则调用。最后由NioServerSocketPipelineSink.eventSunk响应最终的下行流事件。NioServerSocketPipelineSink会调用NioServerBoss的bind()
6.该bind()会生成RegisterTask到任务队列中。
7.RegisterTask的任务
7.1.channel.socket.socket().bind绑定address
7.2.fireChannelBound把BOUND事件沿上行流传递,binder对此不处理。
7.3.channel.socket.register()将socket的OP_ACCEPT事件注册到selector上。
以上事件传递如下图所示:
至此,已完成服务器socket的绑定,并开始监听。
- 大小: 36 KB
分享到:
相关推荐
一个netty的入门教程以及源码分析视频,适合刚学习的人
netty源码解析PDF,网络编程
美团基础架构部闪电侠老师的netty源码分析视频
共分两大章:第1 章:深入浅出Netty源码剖析,第2 章:NIO+Netty5各种RPC架构实战演练,以及课程资料,希望对象学习netty的童靴有用。
Netty源码分析总结.rar
netty源码
netty基本使用以及入门资料,具有netty的源码的分析以及服务器启动过程的介绍
netty源码和相关中文文档。帮助您快速上手netty开发。netty体验之旅祝您愉快
netty源码解析视频教程,深入浅出netty源码视频
Netty好资料,Buffer介绍
Netty源码剖析+视频
Netty5.0架构剖析和源码解读.pdf是一本比较全的讲解netty5的书籍,任何对java的nio技术感兴趣的人都值得一看。
【项目实战】Netty源码剖析&NIO;+Netty5各种RPC架构实战演练三部曲视频教程(未加密)
Netty权威指南源码
Netty源码解读之线程
netty-3.3.1.Final-sources.jar src源码
视频分两部分 第1 章 : 第一部分、深入浅出Netty源码剖析。。 第2 章 : 第二部分、NIO+Netty5各种RPC架构实战演练
基于EchoServer对Netty4.1源码进行分析,水平有限,如果有问题大家可以提出来共同分享。
netty 源码
netty源码包,可以本地搭建netty源码环境,学习nio模式