Netty4.x中文教程系列(六) 从头开始Bootstrap
Netty4.x中文教程系列(六) 从头开始Bootstrap
其实自从中文教程系列(五)一直不知道自己到底想些什么。加上忙着工作上出现了一些问题。本来想就这么放弃维护了。没想到有朋友和我说百度搜索推荐了我的文章。瞬间有点小激动啊。决定自己要把这个教程系列完善下去。这里诚挚的想支持我的盆友们道歉。真的是让你们失望了。我居然有想放弃的这种丧心病狂的念头。以后绝对不会了。
其实伴随着对Netty的逐步深入学习。感觉自己对netty的了解仍然有所欠缺。加上笔者语文课是美术老师教的。所以。。说多了都是泪啊。~~o(>_<)o ~~
下面开始正文:
纵览Netty框架的包结构,不难看出。其实Netty是有五大模块组成。

- Bootstrap负责启动引导
- Buffer是Netty自己封装的缓存器
- Channel负责管理和建立连接
- Handler是责任链路模式中的处理者
- Util是Netty提供和使用到的一些工具
如何启动Netty服务器
Netty的启动服务器相关的类全部都在bootstrap包里面。所以本章我们从头开始,从bootstrap包里面的内容开始。从创建一个Netty服务器开始为大家逐步讲解Netty的应用。
相比于第五章的ChannelHandler里面的编解码器bootstrap里面可以说是内容少的可怜。来看一下他的包内容:

简简单单的三个类,一个接口。
Bootstrap是客户端的启动程序类。
ServerBootstrap是服务端的启动程序类
Bootstrap和ServerBootstrap继承AbstractBootstrap。
ChannelFactory则是AbstractBootstrap中用于创建Channel的接口
以下代码以服务端的启动程序启动为例:
步骤一:实例化ServerBootstrap
首先我们需要实例化一个ServerBootstrap服务端启动引导程序。如下图:

步骤二:设置它的线程组
创建两个NioEventLoopGroup,一个是父线程(Boss线程),一个是子线程(work线程)。

设置bootstrap的线程组

设置线程组主要的目的是为了处理Channel中的事件和IO操作。
下图为ServerBootstrap的group方法的源码:

父线程组被传递到父类中。详细的解释在最后面。涉及的东西太多。在后面在进行解释。
步骤三:设置Channel类型
设置Channel类型:

下图ServerBootstrap中channel()方法的源码:

我们可以看到创建并设置了一个Channel工厂。
下图是BootstrapChannelFactory的源码。它是一个终态的静态的类。实现ChannelFactory。作用是根据初始设置的Channel类型,创建并返回一个新的Channel。

步骤四:设置责任链路
责任链模式是Netty的核心部分。每个处理者只负责自己有关的东西。然后将处理结果根据责任链传递下去。

我们要在初始的设置一个责任链路。当一个Channel被创建之后初始化的时候将被设置。下图是ServerBootstrap在init()方法的源码:

创建一个Channel,在初始化的设置管道里面的处理者。
步骤五:绑定并监听端口
绑定并设置监听端口。

经过以上的5个步骤,我们的服务器就足以启动了。很多的设置都是Netty默认的。我们想设置自己的参数怎么办呢?Netty提供了这个方法。
步骤六:其他设置
1. 设置Channel选项配置:
在Netty 以前的版本中都是以字符串来配置的。4.x版本发布之后统一修改为使用ChannelOption类来实现配置。
例如:

Socket连接是否保存连接:

还有很多其他的参数。如下图所示:

这里不详细讲了。参考:io.netty.channel.ChannelOption
2. 设置子Channel的属性:

设置子Channel的属性。当值为null是,属性将被删除。
解释EventLoopGroup
这里解释一下我们上面创建的两个完全一样的线程组的作用。
Netty的架构使用了非常复杂的主从式Reactor线程模型。简单的说就是。父线程组(代码中的parentBosser)担任(acceptor)的角色。负责接收客户端的连接请求,处理完成请求,创建一个Channel并注册到子线程组(代码中的childWorker)中的某个线程上面,然后这个线程将负责Channel的读写,编解码等操作。
源代码查看:
在步骤四中我们设置了责任链路。这里是Channel初始化和注册。在这里的init就是Channel的初始化。初始化完成之后。Group()则是获取在步骤一种的设置父线程组,并将这个新的Channel注册进来。
下图是AbstractBootstrap的initAndRegister方法

方法Init()实现在ServerBootstrap中。代码如下:

看到下面的代码是不是有种和熟悉的感觉?没错。就是在步骤四中设置责任链路的那段代码。这里将注册新创建的Channel到子线程组
Ps: 完。。。O(∩_∩)O哈哈~。。。写的好辛苦的说。。。附上我的测试示例代码。好累。。写这么多字。希望能帮助到大家
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.LengthFieldBasedFrameDecoder;
import io.netty.handler.codec.LengthFieldPrepender; /**
* 测试。。O(∩_∩)O哈哈~
* Created by TinyZ on 2014/8/12.
*/
public class MainTest { public static void main(String[] args) throws Exception { NioEventLoopGroup parentBosser = new NioEventLoopGroup();
NioEventLoopGroup childWorker = new NioEventLoopGroup(); ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.group(parentBosser, childWorker);
bootstrap.channel(NioServerSocketChannel.class);
bootstrap.childHandler(new ChannelInitializer<NioSocketChannel>() {
@Override
protected void initChannel(NioSocketChannel ch) throws Exception {
ChannelPipeline cp = ch.pipeline();
// 基于长度的解码器
cp.addLast("framer", new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE, 0, 2, 0, 2));
cp.addLast("prepender", new LengthFieldPrepender(4));
//
cp.addLast("handler", new SimpleChannelInboundHandler<Object>() { @Override
protected void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception { System.out.println();
ctx.channel().writeAndFlush(msg); }
});
}
});
bootstrap.option(ChannelOption.SO_KEEPALIVE, true);
//bootstrap.childAttr()
try {
// 绑定并监听端口
ChannelFuture future = bootstrap.bind(9002).sync();
// 等待关闭事件
future.channel().closeFuture().sync();
} finally {
// 释放资源
parentBosser.shutdownGracefully();
childWorker.shutdownGracefully();
}
}
}
作者:TinyZ
出处:http://www.cnblogs.com/zou90512/
关于作者:努力学习,天天向上。不断探索学习,提升自身价值。记录经验分享。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接
如有问题,可以通过 zou90512@126.com 联系我,非常感谢。
笔者网店: http://aoleitaisen.taobao.com. 欢迎广大读者围观
Netty4.x中文教程系列(六) 从头开始Bootstrap的更多相关文章
- Netty4.x中文教程系列(一) 目录及概述
Netty4.x中文教程系列(一)目录及概述 Netty 提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客户端程序. Netty是一个NIO客户端 服务端框架 ...
- Netty4.x中文教程系列(五)编解码器Codec
Netty4.x中文教程系列(五)编解码器Codec 上一篇文章详细解释了ChannelHandler的相关构架设计,版本和设计逻辑变更等等. 这篇文章主要在于讲述Handler里面的Codec,也就 ...
- Netty4.x中文教程系列(四) 对象传输
Netty4.x中文教程系列(四) 对象传输 我们在使用netty的过程中肯定会遇到传输对象的情况,Netty4通过ObjectEncoder和ObjectDecoder来支持. 首先我们定义一个U ...
- Netty4.x中文教程系列(三) ChannelHandler
Netty4.x中文教程系列(四) ChannelHandler 上一篇文章详细解释了Hello World示例的代码.里面涉及了一些Netty框架的基础. 这篇文章用以解释ChannelHandl ...
- Netty4.x中文教程系列(二) Hello World !
在中国程序界.我们都是学着Hello World !慢慢成长起来的.逐渐从一无所知到熟悉精通的. 第二章就从Hello World 开始讲述Netty的中文教程. 首先创建一个Java项目.引入一个N ...
- Netty4.x中文教程系列(二) Hello World !<转>
在中国程序界.我们都是学着Hello World !慢慢成长起来的.逐渐从一无所知到熟悉精通的. 第二章就从Hello World 开始讲述Netty的中文教程. 首先创建一个Java项目.引入一个N ...
- struts2官方 中文教程 系列六:表单验证
先贴个本帖的地址,以免被爬:struts2教程 官方系列六:表单验证 即 http://www.cnblogs.com/linghaoxinpian/p/6906720.html 下载本章节代码 介 ...
- Netty4.x中文教程系列(三) Hello World !详解
Netty 中文教程 (二) Hello World !详解 上一篇文章,笔者提供了一个Hello World 的Netty示例. 时间过去了这么久,准备解释一下示例代码. 1.HelloServer ...
- Netty4.x中文教程系列(一) Hello World !
1.下载并为项目添加Netty框架 1. Netty的包大家可以从Netty官网:http://netty.io/downloads.html 下载 如图所示: Netty提供了四个个主要版本的框架包 ...
随机推荐
- IP地址转换、主机大小端、htonl、ntohl实现
copy #include <IOSTREAM> //#include <WINSOCK.H> using std; typedef uint16; unsigned ...
- vmware虚拟机 C硬盘空间 无损扩容 新测
摘自: http://hi.baidu.com/y276827893/item/78a351f427726549932af214 其实上面一步的话, 虚拟机设置 里选择磁盘,实用工具里也有这个功能的. ...
- Tomcat9 访问 Manager App
1.介绍 在配置好Tomcat,我们往往需要访问Tomcat的Manager以及Host Manager.就需要在tomcat-users.xml中配置用户角色来实现.在地址栏输入:localhost ...
- Python自然语言处理资料库
1.LTP [1]- 语言技术平台(LTP) 提供包括中文分词.词性标注.命名实体识别.依存句法分析.语义角色标注等丰富. 高效.精准的自然语言处理技术.经过哈工大社会计算与信息检索研究中心 11 年 ...
- Android面试,简要介绍一下asynctask和handler的优缺点
1 )AsyncTask实现的原理,和适用的优缺点 AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以 ...
- 【云计算】使用supervisor管理Docker多进程-ntpd+uwsgi+nginx示例最佳实践
supervisor安装启动: apt-get install supervisor -y # start supervisord nodaemon /usr/bin/supervisord --no ...
- 对Class.getResourceAsStream和ClassLoader.getResourceAsStream方法所使用的资源路径的解释
这是个非常基础的问题了,这里提供一些演示样例,帮助高速理解和记忆这个问题. 在该方法的文档:http://docs.oracle.com/javase/7/docs/api/java/lang/Cla ...
- .NET dnSpy 程序集编辑器,反编译器和调试器
https://github.com/0xd4d/dnSpy https://github.com/0xd4d/dnSpy/releases/ dnSpy是反向工程.NET程序集的工具.它包括一个反编 ...
- Android常用传感器用法一览(3)
Android 开发包标准有8个传感器: Sensor.TYPE_ACCELEROMETER o 加速度计 (X, Y, Z) m/s2 Sensor.TYPE_GYROSCOPE o 陀螺仪 (X, ...
- 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-为什么无法打开官方范例的项目,打开tszip文件时提示尝试越过结尾怎么办
打开新的解决方案,找到tszip文件 提示错误Advanced Setting时越过结尾 到这里一般VS会卡死 但是我们已经可以得到解压出来的文件夹,其中包含PLC的完整项目文件夹,可以新 ...