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

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,提供的事件还有很多,以后会慢慢的接触和介绍。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章