前面关注的地方都是Netty采用的流水线处理方式的组织方式,ChannelHandler如何管理,通道状态,通道事件等这些上层的架构设计,那么Netty中如何实现诸如套接字绑定,连接,关闭等这些底层的操作呢?不能只顾着套用API写程序,却对细节不求甚解。这里大致追踪下OIO模式下Channel中套接字绑定的实现,(NIO以后分析)其实逻辑都是一样的,只是在线程模型的地方时不同的。
大致过程如下(详细的源码注释,看我的github):
1.我们在通过Bootstrap启动客户端或者服务端的时候会提供相应的ChannelFactory;
2.在这个Factory构造的过程中会得到相应的外部资源,和初始化底层的ChannelSink对象,否则的话一个Pipeline默认的Sink是DiscardingChannelSink没有任何公用;
3.Bootstrap的绑定方法打开通道,而后调用通道的bind方法;
4.绑定方法最终同意由Channels辅助类完成;
4.Channels.bind根据state和value构造一个state event,发送到最下面的DownstreamHandler;
4.那么这些命令都会最终由具体的ChannelSink来完成,因为具体的Channel中维护的是Java Socket以及输入输出流,所以这里就是真正的套接字绑定。
时间: 2024-10-05 12:14:21