Netty3 源代码分析 - NIO server绑定过程分析

一个框架封装的越好,越利于我们高速的coding。可是却掩盖了非常多的细节和原理。可是源代码可以揭示一切。

服务器端代码在指定好ChannelFactory。设定好选项。而后Bootstrap.bind操作就会开启server。接受对端的连接。

所以有必要对这后面的过程分析清楚,下图是关键流程。先是构建一个默认的Pipeline,为我们接下来要创建的监听通道服务。这个Pipeline里面会增加一个Binder的上行事件处理器。接下来创建了至关中的NioServerSocketChannel,在构造的过程中,调用了NIO中ServerSocketChannel的open方法打开套接字,设为非堵塞,然后会触发一个OPEN的上行
ChannelStateEvent(为后文买下伏笔),接下来Bootstrap就会等待着成功的信号。还有一方面,在将Binder这个Handler增加bossPipeline的时候,它就已经准备好运转了,在收到一个OPEN事件后,就会设置套接字选项,运行真正的套接字绑定,而后Future.setSuccess就会让前面的bind方法成功返回,開始运转。

代码例如以下:

public void channelOpen(
ChannelHandlerContext ctx, ChannelStateEvent evt) {

try {

// 内部类能够訪问外部类的方法 。如 getPipelineFactory()。

evt.getChannel().getConfig().setPipelineFactory(getPipelineFactory());

// Split options into two categories: parent and child.

Map<String, Object> allOptions = getOptions();

Map<String, Object> parentOptions = new HashMap<String,
Object>();

for (Entry<String, Object> e: allOptions.entrySet())
{

if (e.getKey().startsWith( "child."))
{

childOptions.put( e.getKey().substring(6), e.getValue());

else if (!"pipelineFactory" .equals(e.getKey()))
{

parentOptions.put(e.getKey(), e.getValue());

}

}

// Apply parent options.

evt.getChannel().getConfig().setOptions(parentOptions);

finally {

ctx.sendUpstream(evt);

}

//============ 真正的绑定套接字 =======

evt.getChannel().bind( localAddress).addListener( new ChannelFutureListener()
{

public void operationComplete(ChannelFuture
future) throws Exception {

if (future.isSuccess()) {

// 这里触发了 bind的成功

bindFuture.setSuccess();

else {

bindFuture.setFailure(future.getCause());

}

}

});

}

更具体的理解看Netty3 源代码凝视,见Github

时间: 2024-10-22 09:07:59

Netty3 源代码分析 - NIO server绑定过程分析的相关文章

Netty3 源码分析 - NIO server绑定过程分析

一个框架封装的越好,越利于我们快速的coding,但是却掩盖了很多的细节和原理,但是源码能够揭示一切.服务器端代码在指定好ChannelFactory,设定好选项,而后Bootstrap.bind操作就会开启server,接受对端的连接.所以有必要对这后面的过程分析清楚,下图是关键流程.先是构建一个默认的Pipeline,为我们接下来要创建的监听通道服务,这个Pipeline里面会加入一个Binder的上行事件处理器:接下来创建了至关中的NioServerSocketChannel,在构造的过程

Netty3 源码分析 - NIO server接受连接请求过程分析

当服务器端的server Channel绑定某个端口之后,就可以处理来自客户端的连接请求,而且在构建 NioServerSocketChannelFactory 的时候已经生成了对应的 BossPool 和 WorkerPool,前者管理的 NioServerBoss 就是专门用来接受客户端连接的Selector封装,当,下面是关键的代码: 1. AbstractNioSelector中的run方法代表这个boss thread的核心工作. public void run() { thread 

Android应用程序绑定服务(bindService)的过程源代码分析

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6745181 Android应用程序组件Service与Activity一样,既可以在新的进程中启动,也可以在应用程序进程内部 启动:前面我们已经分析了在新的进程中启动Service的过程,本文将要介绍在应用程序内部绑定Service的过程,这是一种在应用程序进程内部启动 Service的方法. 在前面一篇文章Android进程间通信(IPC)机

ftp server源代码分析20140602

当前是有些工具比如apktool,dextojar等是可以对我们android安装包进行反编译,获得源码的.为了减少被别人破解,导致源码泄露,程序被别人盗取代码,等等.我们需要对代码进行混淆,android的sdk中为我们提供了ProGrard这个工具,可以对代码进行混淆(一般是用无意义的名字来重命名),以及去除没有使用到的代码,对程序进行优化和压缩,这样可以增加你想的难度.最近我做的项目,是我去配置的混淆配置,因此研究了一下,这里分享一下. 如何启用ProGuard ant项目和eclipse

Android系统进程间通信(IPC)机制Binder中的Client获得Server远程接口过程源代码分析

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6633311 在上一篇文章中,我 们分析了Android系统进程间通信机制Binder中的Server在启动过程使用Service Manager的addService接口把自己添加到Service Manager守护过程中接受管理.在这一篇文章中,我们将深入到Binder驱动程序源代码去分析Client是如何通过Service Manager的

Kafka SocketServer源代码分析

Kafka SocketServer源代码分析 标签: kafka 本文将详细分析Kafka SocketServer的相关源码. 总体设计 Kafka SocketServer是基于Java NIO来开发的,采用了Reactor的模式,其中包含了1个Acceptor负责接受客户端请求,N个Processor负责读写数据,M个Handler来处理业务逻辑.在Acceptor和Processor,Processor和Handler之间都有队列来缓冲请求. kafka.network.Accepto

Jafka源代码分析——网络架构

在kafka中,每一个broker都是一个服务器.按照一般理解,服务器就是一个SocketServer,其不断接收用户的请求并进行处理.在Java中进行网络连接有两种方式一种为阻塞模式一种为非阻塞模式.Jafka采用非阻塞模式进行网络通讯.在Java的非阻塞模式中,建立socket server的一般流程如下: 1.启动ServerSocketChannel并将其绑定到特定的端口. 2.将ServerSocketChannel以及其感兴趣的操作注册到Selector,在这里感兴趣的操作是Acce

Android应用Activity、Dialog、PopWindow、Toast窗体加入机制及源代码分析

[工匠若水 http://blog.csdn.net/yanbober 转载烦请注明出处.尊重劳动成果] 1 背景 之所以写这一篇博客的原因是由于之前有写过一篇<Android应用setContentView与LayoutInflater载入解析机制源代码分析>.然后有人在文章以下评论和微博私信中问我关于Android应用Activity.Dialog.PopWindow载入显示机制是咋回事,所以我就写一篇文章来分析分析吧(本文以Android5.1.1 (API 22)源代码为基础分析),以

Android系统进程Zygote启动过程的源代码分析

原文地址:http://blog.csdn.net/luoshengyang/article/details/6747696 Android应用程序框架层创建的应用程序进程具有两个特点,一是进程的入口函数是ActivityThread.main,二是进程天然支持Binder进程间通信机制:这两个特点都是在进程的初始化过程中实现的,本文将详细分析Android应用程序进程创建过程中是如何实现这两个特点的. Android应用程序框架层创建的应用程序进程的入口函数是ActivityThread.ma