Java NIO框架Netty(一) – 原理和使用-Hello world

来源:互联网 发布:cpa软件是什么意思啊 编辑:程序博客网 时间:2024/06/08 13:58

1,Netty原理和使用

  Netty是一个高性能 事件驱动的异步的非堵塞的IO(NIO)框架,用于建立TCP等底层的连接,基于Netty可以建立高性能的Http服务器。支持HTTP、 WebSocket 、Protobuf、 Binary TCP |和UDP,Netty已经被很多高性能项目作为其Socket底层基础,如HornetQ Infinispan Vert.x
Play Framework Finangle和 Cassandra。其竞争对手是:Apache MINA和 Grizzly。

   传统堵塞的IO读取如下:

InputStream is = new FileInputStream(“input.bin”);
int byte = is.read(); // 当前线程等待结果到达直至错误

   而使用NIO如下:

while (true) {
 selector.select(); // 从多个通道请求事件
 Iterator it = selector.selectedKeys().iterator();
 while (it.hasNext()) {
  SelectorKey key = (SelectionKey) it.next();
  handleKey(key);
  it.remove();
 }

堵塞与非堵塞原理

  传统硬件的堵塞如下,从内存中读取数据,然后写到磁盘,而CPU一直等到磁盘写完成,磁盘的写操作是慢的,这段时间CPU被堵塞不能发挥效率。
  
这里写图片描述

  使用非堵塞的DMA如下图:CPU只是发出写操作这样的指令,做一些初始化工作,DMA具体执行,从内存中读取数据,然后写到磁盘,当完成写后发出一个中断事件给CPU。这段时间CPU是空闲的,可以做别的事情。这个原理称为Zero.copy零拷贝。
  
这里写图片描述
  Netty底层基于上述Java NIO的零拷贝原理实现:
  
  这里写图片描述

2,Hello world

程序员们习惯的上手第一步,自然是”Hello world”,不过Netty官网的例子却偏偏抛弃了”Hello world”。那我们就自己写一个最简单的”Hello world”的例子,作为上手。

编写服务端代码

    /**      * Netty 服务端代码      *       * @author lichch     */      public class HelloServer {          public static void main(String args[]) {              // Server服务启动器              ServerBootstrap bootstrap = new ServerBootstrap(                      new NioServerSocketChannelFactory(                              Executors.newCachedThreadPool(),                              Executors.newCachedThreadPool()));              // 设置一个处理客户端消息和各种消息事件的类(Handler)              bootstrap                      .setPipelineFactory(new ChannelPipelineFactory() {                          @Override                          public ChannelPipeline getPipeline()                                  throws Exception {                              return Channels                                      .pipeline(new HelloServerHandler());                          }                      });              // 开放8000端口供客户端访问。              bootstrap.bind(new InetSocketAddress(8000));          }          private static class HelloServerHandler extends                  SimpleChannelHandler {              /**              * 当有客户端绑定到服务端的时候触发,打印"Hello world, I'm server."              *               * @author lichch             */              @Override              public void channelConnected(                      ChannelHandlerContext ctx,                      ChannelStateEvent e) {                  System.out.println("Hello world, I'm server.");              }          }      }  **客户端代码** 

/**
* Netty 客户端代码
*
* @author lichch

 */  public class HelloClient {      public static void main(String args[]) {          // Client服务启动器          ClientBootstrap bootstrap = new ClientBootstrap(                  new NioClientSocketChannelFactory(                          Executors.newCachedThreadPool(),                          Executors.newCachedThreadPool()));          // 设置一个处理服务端消息和各种消息事件的类(Handler)          bootstrap.setPipelineFactory(new ChannelPipelineFactory() {              @Override              public ChannelPipeline getPipeline() throws Exception {                  return Channels.pipeline(new HelloClientHandler());              }          });          // 连接到本地的8000端口的服务端          bootstrap.connect(new InetSocketAddress(                  "127.0.0.1", 8000));      }      private static class HelloClientHandler extends SimpleChannelHandler {          /**          * 当绑定到服务端的时候触发,打印"Hello world, I'm client."          *           * @author lichch         */          @Override          public void channelConnected(ChannelHandlerContext ctx,                  ChannelStateEvent e) {              System.out.println("Hello world, I'm client.");          }      }  }  

“`

小结

Netty中,需要区分Server和Client服务。所有的Client都是绑定在Server上的,他们之间是不能通过Netty直接通信的。(自己采用的其他手段,不包括在内。)。白话一下这个通信过程,Server端开放端口,供Client连接,Client发起请求,连接到Server指定的端口,完成绑定。随后便可自由通信。其实就是普通Socket连接通信的过程。

Netty框架是基于事件机制的,简单说,就是发生什么事,就找相关处理方法。就跟着火了找119,抢劫了找110一个道理。所以,这里,我们处理的是当客户端和服务端完成连接以后的这个事件。什么时候完成的连接,Netty知道,他告诉我了,我就负责处理。这就是框架的作用。Netty,提供的事件还有很多,以后会慢慢的接触和介绍。

原创粉丝点击