Netty初学之一:简介-HellWord-讲解

一.netty简介:

  1. 简介

        Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、
        高可靠性的网络服务器和客户端程序。例如实现了某种协议的客户,服务端应用。
        Netty相当简化和流线化了网络应用的编程开发过程,例如,TCP和UDP的socket服务开发。
    
  2. 解释

    nio是什么:

    nio 是 java New IO 的简称,在 jdk1.4 里提供的新 api 官方标榜的特性如下:

    – 为所有的原始类型提供 (Buffer) 缓存支持。

    – 字符集编码解码解决方案。

    – Channel :一个新的原始 I/O 抽象。

    – 支持锁和内存映射文件的文件访问接口。

    – 提供多路 (non-bloking) 非阻塞式的高伸缩性网络 I/O 。

  3. netty的功能

       netty是分布式的,分多个服务,Netty中,需要区分Server和Client服务。所有的Client都是绑定在Server上的,
       他们之间是不能通过Netty直接通信的。 通信过程是:Server端开放端口,供Client连接,Client发起请求,
       我们做的是客户端与服务器连接完成的事情。客户端告诉我连接成功了,我就负责处理,这就是netty框架的作用。
    

二、新技术之惯例-hello,Word!

    1.服务端代码
    package com.baidu.netty;

    import java.net.InetSocketAddress;
    import java.util.concurrent.Executors;
    import org.jboss.netty.channel.ChannelHandlerContext;
    import org.jboss.netty.channel.ChannelPipeline;
    import org.jboss.netty.channel.ChannelPipelineFactory;
    import org.jboss.netty.channel.ChannelStateEvent;
    import org.jboss.netty.channel.Channels;
    import org.jboss.netty.channel.SimpleChannelHandler;
    importorg.jboss.netty.channel.socket.nio.
                NioServerSocketChannelFactory;
    import org.jboss.netty.bootstrap.ServerBootstrap;

public class HelloServer {

    public static void main(String[] args) {
         // 创建Server服务器  

        ServerBootstrap bootstrap = new ServerBootstrap(  

                new NioServerSocketChannelFactory(  

                        Executors.newCachedThreadPool(),  

                        Executors.newCachedThreadPool()));  

        //设置这个类
        bootstrap.setPipelineFactory(
                new ChannelPipelineFactory() {

        // 处理客户端消息和事件的类(Handler)  

        @Override
        public ChannelPipeline getPipeline() throws Exception {
             returnChannels.pipeline(newHelloServerHandler()); 
            }
        });

        // 开放本机8000端口供客户端访问。  

        bootstrap.bind(new InetSocketAddress(8000));  

    }

    private static class HelloServerHandler extends SimpleChannelHandler{  

//当有客户端绑定到服务端的时候触发,打印:Hello,world!----我是服务器

@Override  
public void channelConnected(ChannelHandlerContext ctx,  
                    ChannelStateEvent e) {  

                System.out.println("Hello,world!----我是服务器");  

            }  
        }  
    }  

    2.客户端代码
    package com.baidu.netty;

    import java.net.InetSocketAddress;
    import java.util.concurrent.Executors;
    import org.jboss.netty.bootstrap.ClientBootstrap;
    import org.jboss.netty.channel.ChannelHandlerContext;
    import org.jboss.netty.channel.ChannelPipeline;
    import org.jboss.netty.channel.ChannelPipelineFactory;
    import org.jboss.netty.channel.ChannelStateEvent;
    import org.jboss.netty.channel.Channels;
    import org.jboss.netty.channel.SimpleChannelHandler;
    import org.jboss.netty.channel.socket.nio.
    NioClientSocketChannelFactory;

    public class HelloClient {

        public static void main(String args[]) {  

            // 创建Client服务启动器  
            ClientBootstrap bootstrap = new ClientBootstrap(  

                new NioClientSocketChannelFactory(  

                        Executors.newCachedThreadPool(),  

                        Executors.newCachedThreadPool()));  

        //设置这个类 
        bootstrap.setPipelineFactory(new ChannelPipelineFactory() {

        // 处理服务端消息和事件的类(Handler)  

        @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! 我是客户端 

        @Override  
        public void channelConnected(ChannelHandlerContext ctx,  

                ChannelStateEvent e) {  

            System.out.println("Hello,world! 我是客户端");  

        }  
    }  
}

三、知识点讲解

1.先来说说这个 ChannelEvent,Netty 是基于事件驱动的,就是我们
上文提到的,发生什么事,就通知”有关部门”。
我们处理的事件就是 channelConnected。以后,我们还会处理更多的事件。
ChannelEvent
2.Pipeline,翻译成中文的意思是:管道,传输途径。也就是说,在这里他是控制 ChannelEvent 事件分发和传递的。
事件在管道中流转,第一站到哪,第二站到哪,到哪是终点,就是用这个 ChannelPipeline 处理的。
事件到了 ChannelHandler 这里,就要被具体的进行处理了,也就是说,你自己的业务逻辑一般都是从这里开始的。
ChannekPipeline
ChannelPipeline
4.有了个部门的协调处理,我们还需要一个从整体把握形势的,所谓―大局观的部门,channel。
是一些全局的信息。Channel 自然是由 ChannelFactory 产生的。Channel 的实现类型,
决定了你这个通道是同步的还是异步的(nio)。例如,我们样例里用的是NioServerSocketChannel 。
Channel
这些是基本概念,希望大家相互学习,上面的有些资料摘自其他大神,谢谢大家!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值