`
xklin04
  • 浏览: 12715 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

初识Netty3.6

阅读更多
今天开始接触Netty这个NIO框架,由与MINA同一作者创作的框架,在看过User Guide 3.6之后,API风格与使用方式与MINA2大致类似。作为学习新框架的起始,先来几个Hello World程序吧。
看API依然是基于Reactor模型,程序分三部分
1.事件处理程序
主要包括对具体业务消息的处理,对各种连接状态的响应

  
    public class TimeServerHandler extends SimpleChannelHandler {
   
        @Override
       public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) {
            Channel ch = e.getChannel();
           
            ChannelBuffer time = ChannelBuffers.buffer(4);
          time.writeInt((int) (System.currentTimeMillis() / 1000L + 2208988800L));
            
          ChannelFuture f = ch.write(time);
            
          f.addListener(new ChannelFutureListener() {
                public void operationComplete(ChannelFuture future) {
                  Channel ch = future.getChannel();
                    ch.close();
             }
            });
      }
    
      @Override
        public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) {
          e.getCause().printStackTrace();
            e.getChannel().close();
      }
    }

2.编解码器
在大流量数据传输时的必备品,在流传输的基础根据业务情况分隔出数据包处理,ChannelBuffer转成POJO比较适合在解码器中进行。
package org.jboss.netty.example.time;
   
    public class TimeDecoder extends FrameDecoder(22) {
   
        @Override
       protected Object decode(
                ChannelHandlerContext ctx, Channel channel, ChannelBuffer buffer) {
               
            if (buffer.readableBytes() < 4) {//如果不够数据,返回空对象,不处理
              return null; (24)
            }
          
            return buffer.readBytes(4);(25)
      }
    }


解码器不需要递归调用直到数据解析完毕,框架会自动调动直到把已接收的数据处理完毕。
另一个非常方便的解码器是ReplayingDecoder,它假设在解码时已经有足够的数据,如:
public class IntegerHeaderFrameDecoder
      extends ReplayingDecoder<VoidEnum> {

   protected Object decode(ChannelHandlerContext ctx,
                           Channel channel,
                           ChannelBuffer buf,
                           VoidEnum state) throws Exception {

     return buf.readBytes(buf.readInt());
   }
 }




编码器使用如下
public class TimeEncoder extends SimpleChannelHandler {
   
        public void writeRequested(ChannelHandlerContext ctx, MessageEvent(27) e) {
           UnixTime time = (UnixTime) e.getMessage();
            
          ChannelBuffer buf = buffer(4);
            buf.writeInt(time.getValue());
          
            Channels.write(ctx, e.getFuture(), buf);(28)
      }
    }


3.主体程序
服务器端:
public class DiscardServer {
    
      public static void main(String[] args) throws Exception {
            ChannelFactory factory =
              new NioServerSocketChannelFactory(
                        Executors.newCachedThreadPool(),
                      Executors.newCachedThreadPool());
    
          ServerBootstrap bootstrap = new ServerBootstrap(factory);
    
          bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
                public ChannelPipeline getPipeline() {
                  return Channels.pipeline(new TimeDecoder(),new DiscardServerHandler());//此处注意是否有顺序要求
                }
          });
    
          bootstrap.setOption("child.tcpNoDelay", true);
            bootstrap.setOption("child.keepAlive", true);
  
            bootstrap.bind(new InetSocketAddress(8080));
      }
    }


服务器资源释放包括:释放socket相关资源、释放ChannelFactory占用的资源
Netty提供了ChannelGroup来管理所有活动的连接,如果连接关闭则自动从集合中删除。
 
 public void channelOpen(ChannelHandlerContext ctx, ChannelStateEvent e) {
        TimeServer.allChannels.add(e.getChannel());(34)
   }
public class TimeServer {
   
        static final ChannelGroup allChannels = new DefaultChannelGroup("time-server"(35));
   
        public static void main(String[] args) throws Exception {
           ...
            ChannelFactory factory = ...;
          ServerBootstrap bootstrap = ...;
            ...
          Channel channel(36) = bootstrap.bind(...);
            allChannels.add(channel);(37)
          waitForShutdownCommand();(38)
            ChannelGroupFuture future = allChannels.close();(39)
          future.awaitUninterruptibly();
            factory.releaseExternalResources();
      }
    }



客户端:
 public class TimeClient {
    
       public static void main(String[] args) throws Exception {
            String host = args[0];
          int port = Integer.parseInt(args[1]);
    
          ChannelFactory factory =
                new NioClientSocketChannelFactory(
                      Executors.newCachedThreadPool(),
                        Executors.newCachedThreadPool());
  
            ClientBootstrap bootstrap = new ClientBootstrap(16)(factory);
  
            bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
              public ChannelPipeline getPipeline() {
                    return Channels.pipeline(new TimeDecoder(),new TimeClientHandler());//此处注意是否有顺序要求
              }
            });
          
            bootstrap.setOption("tcpNoDelay"(17), true);
          bootstrap.setOption("keepAlive", true);
    
         ChannelFuture future= bootstrap.connect(18)(new InetSocketAddress(host, port));

future.awaitUninterruptibly();(30)
            if (!future.isSuccess()) {
              future.getCause().printStackTrace();(31)
            }
          future.getChannel().getCloseFuture().awaitUninterruptibly();(32)
            factory.releaseExternalResources();(33)
      }

        }
  }


参考文献:http://netty.io/3.6/guide/
分享到:
评论

相关推荐

    netty 3.6 jar包

    netty 3.6 的jar包给需要的人

    spring+mybatis+netty3.6 HTTP服务器项目

    【标题】"Spring+Mybatis+Netty3.6 HTTP服务器项目"是一个综合性的Web服务开发实例,结合了三个核心的开源技术框架:Spring、Mybatis和Netty3.6。这个项目旨在创建一个高性能、可扩展的HTTP服务器,能够处理GET和...

    Netty 3.6.3 api查询手册

    netty最新正式发布版3.6.3的api文档,英文原版,作成chm格式,方便检索。

    基于Netty框架的demo项目

    本demo紧密结合了本人发布的《初识Netty》一文中的示例,为学习者提供了一个直观、实用的学习参考。项目中,你可以清晰地看到BIO与NIO模型在Netty中的灵活运用,如何通过Netty的高性能特性来优化网络通信。此外,...

    跟闪电侠学Netty:Netty即时聊天实战与底层原理-book-netty.zip

    《跟闪电侠学Netty:Netty即时聊天实战与底层原理》是一本深入浅出的Netty技术指南,旨在帮助读者掌握Netty框架,并利用它实现即时聊天应用,同时理解其底层工作原理。Netty是Java领域的一款高性能、异步事件驱动的...

    Netty实战 电子版.pdf_java_netty_服务器_

    《Netty实战》是针对Java开发者的一本技术指南,它深入介绍了如何利用Netty这个高性能、异步事件驱动的网络应用程序框架来构建高效且可扩展的网络应用。Netty不仅简化了网络编程的复杂性,还提供了丰富的特性和组件...

    Netty进阶之路-跟着案例学Netty

    《Netty进阶之路-跟着案例学Netty》是由知名技术专家李林峰撰写的一本专为Java开发者深入理解Netty框架而准备的书籍。这本书旨在通过实例教学,帮助读者全面掌握Netty的核心特性和实战技巧,提升网络编程的能力。 ...

    Netty实战.epub_netty实战epub_netty实战epub_netty_

    《Netty实战》这本书是针对Java网络编程框架Netty的一本深入实践教程,旨在帮助读者掌握Netty的核心特性和实际应用。Netty是一款高性能、异步事件驱动的网络应用程序框架,广泛应用于各种分布式系统、微服务架构以及...

    Netty基础,用于学习Netty,参考黑马程序员的netty教程

    Netty基础,用于学习Netty,参考黑马程序员的netty教程

    netty-netty-4.1.69.Final.tar.gz

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。这个“netty-netty-4.1.69.Final.tar.gz”文件是Netty的最新稳定版本,版本号为4.1.69.Final,它是一个压缩包...

    Netty (netty-netty-5.0.0.Alpha2.tar.gz)

    Netty (netty-netty-5.0.0.Alpha2.tar.gz)是一个 NIO 客户端服务器框架,可以快速轻松地开发协议服务器和客户端等网络应用程序。它极大地简化和流线了网络编程,例如 TCP 和 UDP 套接字服务器。 “快速和简单”并...

    springboot整合 netty做心跳检测

    springboot整合 netty做心跳检测 springboot整合 netty做心跳检测 springboot整合 netty做心跳检测 springboot整合 netty做心跳检测 springboot整合 netty做心跳检测 springboot整合 netty做心跳检测 springboot整合...

    slf4fx-netty-server:SLF4Fx 服务器使用 Netty 而不是 Apache Mina

    slf4fx-netty-服务器SLF4Fx 服务器使用 Netty 而不是 Apache Mina。...变化0.6.0 此版本仅与 Netty 4 兼容(之前仅与 Netty 3.6 兼容) 将包名更改为 io.github.lkowalczyk 要求: JDK 1.5 或更新版本网状 3.6.6

    整合netty实时通讯

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在本文中,我们将深入探讨 Netty 实时通讯的原理与应用,以及如何利用它构建 WebSocket 服务。 WebSocket 是...

    Netty (netty-3.2.5.Final.jar,netty-3.2.5.Final-sources.jar)

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。这个压缩包包含 `netty-3.2.5.Final.jar` 和 `netty-3.2.5.Final-sources.jar` 两个文件,它们分别代表了...

    Netty 教程 Netty权威指南

    **Netty 深度解析** Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。它广泛应用于各种领域,如分布式系统、云计算、游戏服务器、大数据传输等。Netty 的设计...

    netty官网学习手册中文版

    这个“netty官网学习手册中文版”针对的是Netty的3.1版本,虽然现在的Netty已经发展到了5.x版本,但3.1版本的知识仍然具有历史参考价值,特别是对于那些初次接触或需要理解Netty基础概念的开发者来说。 1. **Netty...

    Netty权威指南 PDF电子书下载 带目录书签 完整版

    《Netty权威指南》是一本深入探讨Netty框架的专业书籍,专为Java开发者设计,旨在帮助读者理解并熟练运用Netty构建高性能...无论你是初识Netty的新手,还是寻求进阶提升的开发者,这本书都能提供丰富的知识和实践指导。

    netty-netty-3.10.6.Final.tar.gz

    Netty (netty-netty-3.10.6.Final.tar.gz)是一个 NIO 客户端服务器框架,可以快速轻松地开发协议服务器和客户端等网络应用程序。它极大地简化和流线了网络编程,例如 TCP 和 UDP 套接字服务器。 “快速和简单”并...

    netty4-netty5.rar

    ChannelHandlerAdapter 4.X版本和5.X版本的差别很大。ChannelRead是属于5.X版本的4.X版本没有这个方法,所以如果要用ChannelRead。可以更换5.X版本的Netty。

Global site tag (gtag.js) - Google Analytics