Java NIO框架Netty教程(十七) Netty4 Hello world
-
最近很多人问我有没有Netty4的Hello World样例,很早之前知道Netty要出4,当时只知道4的包名完全边了,因为Netty从JBoss中独立出来了,并采用了新的netty.io的域名,但是没想到代码也有这么大的调整。
既然答应了别人,就抽时间看一下Netty4,也顺便补充一下自己的知识。还是先从最简单的Hello world开始吧。下面代码基于最近版的Netty4,netty4.0.12-Final。由于Netty4最代码进行了分包,分了很多工程,有可能会对你的开发造成困扰,不过Netty4也提供了一个netty4-all的jar包,里面包含了所有的代码,方便你进行依赖开发。这里OneCoder用的就是该jar包。
01.
/**
02.
* Netty4 服务端代码
03.
*
04.
* @author lihzh
05.
* @date 2013年11月15日 下午1:10:06
06.
* @website http://www.coderli.com
07.
*/
08.
public
class
HelloWorldServer {
09.
10.
public
static
void
main(String[] args) {
11.
// EventLoop 代替原来的 ChannelFactory
12.
EventLoopGroup bossGroup =
new
NioEventLoopGroup();
13.
EventLoopGroup workerGroup =
new
NioEventLoopGroup();
14.
try
{
15.
ServerBootstrap serverBootstrap =
new
ServerBootstrap();
16.
// server端采用简洁的连写方式,client端才用分段普通写法。
17.
serverBootstrap.group(bossGroup, workerGroup)
18.
.channel(NioServerSocketChannel.
class
)
19.
.childHandler(
new
ChannelInitializer<SocketChannel>() {
20.
@Override
21.
public
void
initChannel(SocketChannel ch)
22.
throws
Exception {
23.
ch.pipeline().addLast(
new
HelloServerHandler());
24.
}
25.
}).option(ChannelOption. SO_KEEPALIVE ,
true
);
26.
27.
ChannelFuture f = serverBootstrap.bind(
8000
).sync();
28.
f.channel().closeFuture().sync();
29.
}
catch
(InterruptedException e) {
30.
}
finally
{
31.
workerGroup.shutdownGracefully();
32.
bossGroup.shutdownGracefully();
33.
}
34.
}
35.
36.
private
static
class
HelloServerHandler
extends
37.
ChannelInboundHandlerAdapter {
38.
39.
/**
40.
* 当绑定到服务端的时候触发,打印"Hello world, I'm client."
41.
*
42.
* @alia OneCoder
43.
* @author lihzh
44.
* @date 2013年11月16日 上午12:50:47
45.
*/
46.
@Override
47.
public
void
channelActive(ChannelHandlerContext ctx)
throws
Exception {
48.
System. out .println(
"Hello world, I'm server."
);
49.
}
50.
}
51.
52.
}
53.
54.
/**
55.
* Netty4 客户端代码
56.
* @author OneCoder
57.
* @date 2013年11月15日 下午1:28:21
58.
* @website http://www.coderli.com
59.
*/
60.
public
class
HelloWorldClient {
61.
62.
public
static
void
main(String args[]) {
63.
// Client服务启动器 3.x的ClientBootstrap 改为Bootstrap,且构造函数变化很大,这里用无参构造。
64.
Bootstrap bootstrap =
new
Bootstrap();
65.
// 指定channel类型
66.
bootstrap.channel(NioSocketChannel.
class
);
67.
// 指定Handler
68.
bootstrap.handler(
new
HelloClientHandler());
69.
// 指定EventLoopGroup
70.
bootstrap.group(
new
NioEventLoopGroup());
71.
// 连接到本地的8000端口的服务端
72.
bootstrap.connect(
new
InetSocketAddress(
"127.0.0.1"
,
8000
));
73.
}
74.
75.
private
static
class
HelloClientHandler
extends
76.
ChannelInboundHandlerAdapter {
77.
78.
/**
79.
* 当绑定到服务端的时候触发,打印"Hello world, I'm client."
80.
*
81.
* @alia OneCoder
82.
* @author lihzh
83.
* @date 2013年11月16日 上午12:50:47
84.
*/
85.
@Override
86.
public
void
channelActive(ChannelHandlerContext ctx)
throws
Exception {
87.
System. out .println(
"Hello world, I'm client."
);
88.
}
89.
}
90.
}
一些主要的变化和对比注释在代码中。简单补充介绍几点:
NioEventLoopGroup 是一个处理I/O操作的多线程事件环。即为Netty4里的线程池,在3.x里,一个Channel是由ChannelFactory创建的,同时新创建的Channel会自动注册到一个隐藏的I/O线程。 4.0使用新的名为EventLoopGroup的接口来替换ChannelFactory,它由一个或多个EventLoop来构成。一个新的 Channel不会自动注册到EventLoopGroup,但用户可以显式调用EventLoopGroup.register()来注册。在Server端的Bootstrap参数中,有两个EventLoopGroup,第一个通常称为'boss',用于接收发来的连接请求。第二个称为'worker',,用于处理boss接受并且注册给worker的连接中的信息。ChannelInitializer是一个特殊的handler,用于方便的配置用户自定义的handler实现,如代码中所示。在channelRegistered的生命周期中会触发用户复写的initChannel(C ch)方法,并且在调用后会讲自身从channelPipeline中移除。