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中移除。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值