Netty学习笔记--第一天

学习Netty的笔记,笔者是个纯粹的菜鸟,来源于http://blog.csdn.net/kobejayandy/article/details/11493979
这位大佬的博客
看到有人说大佬没有给出依赖的信息
这里笔者补充一下:

<dependency>
            <groupId>org.jboss.netty</groupId>
            <artifactId>netty</artifactId>
            <version>3.2.9.Final</version>
        </dependency>

Hollow World的实现

    /** 
     * Netty 服务端代码 
     *  
     * @author lihzh 
     * @alia OneCoder 
     * @blog http://www.coderli.com 
     */  
    public class HelloServer {  

        public static void main(String args[]) {  
            // Server服务启动器  
            ServerBootstrap bootstrap = new ServerBootstrap(  //服务器引导
                    new NioServerSocketChannelFactory(  
                    //创建异步服务器套接字通道工厂
                            Executors.newCachedThreadPool(),  

                   //使用Executors创建和管理线程,这里使用newCachedThreadPoll方法创建了一个线程池,对于短期异步线程的程序,提高性能
                            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." 
             *  
             * @alia OneCoder 
             * @author lihzh 
             */  
            @Override  
            public void channelConnected(  
                    ChannelHandlerContext ctx,  
                    ChannelStateEvent e) {  
                System.out.println("Hello world, I'm server.");  
            }  
        }  

    }  

[java] view plain copy

    /** 
     * Netty 客户端代码 
     *  
     * @author lihzh 
     * @alia OneCoder 
     * @blog http://www.coderli.com 
     */  
    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." 
             *  
             * @alia OneCoder 
             * @author lihzh 
             */  
            @Override  
            public void channelConnected(ChannelHandlerContext ctx,  
                    ChannelStateEvent e) {  
                System.out.println("Hello world, I'm client.");  
            }  
        }  
    }  

概念理解
Netty是基于事件驱动的,ChennelEvent可以理解为通道事件,在Netty中处理的事件就是channelConnected
ChannelPipeline通道管道
在这里它是控制channelEvent事件分发和传递的。
ChannelHandler通道处理器
Pipeline负责吧事件分发到Netty中的ChannelHandler进行处理,自己的业务逻辑一般都是从这里开始的
Channel 从整体把握形式的
能够告诉你当前通道的状态,是打开还是关闭,获取通道相关的配置信息,的得到pipleline,是一些全局的信息
Channel自然是由ChannelFactory产生的。Channel的实现类型,决定了你这个通道是同步的还是异步的(nio)。例如,我们样例里用的是NioServerSocketChannel。

Object对象的传递实现
Netty的消息传递都是基于流,通过ChannelBuffer传递的,那么自然,Object也需要转换成ChannelBuffer来传递。好在Netty本身已经给我们写好了这样的转换工具。 ObjectEncoder和ObjectDecoder。

工具怎么用?再一次说说所谓的本质,我们之前也说过,Netty给我们处理自己业务的空间是在灵活的可子定义的Handler上的,也就是说,如果我们自己去做这个转换工作,那么也应该在Handler里去做。而Netty,提供给我们的ObjectEncoder和Decoder也恰恰是一组 Handler。

 服务端


// 设置一个处理客户端消息和各种消息事件的类(Handler)
bootstrap.setPipelineFactory(newChannelPipelineFactory() {
    @Override
    publicChannelPipeline getPipeline()throwsException {
        returnChannels.pipeline(
        newObjectDecoder(ClassResolvers.cacheDisabled(this
                .getClass().getClassLoader())),
        newObjectServerHandler());
    }
});
客户端

// 设置一个处理服务端消息和各种消息事件的类(Handler)
bootstrap.setPipelineFactory(newChannelPipelineFactory() {
    @Override
    publicChannelPipeline getPipeline()throwsException {
        returnChannels.pipeline(newObjectEncoder(),
                newObjectClientHandler());
    }
});

要传递对象,自然要有一个被传递模型,一个简单的Pojo,当然,实现序列化接口是必须的。


/**
 * @author lihzh
 * @alia OneCoder
 * @bloghttp://www.coderli.com
 */
public class Command implementsSerializable {

    privatestaticfinal long serialVersionUID = 7590999461767050471L;

    privateString actionName;

    publicString getActionName() {
        returnactionName;
    }

    publicvoidsetActionName(String actionName) {
        this.actionName = actionName;
    }
}

服务端消息发送代码段

private static class ObjectServerHandler extends SimpleChannelHandler{
        public void messageReceived(ChannelHandlerContext ctx,MessageEvent e)
                throws Exception{
                    Command command=(Command) e.getMessage();
                    System.out.println(command.getActionName());
                }
    }

客户端消息接收代码段

public static class ObjectClientHandler extends SimpleChannelHandler{
         public void channelConnected(ChannelHandlerContext ctx,ChannelStateEvent e) {
             sendObject(e.getChannel());
         }
         private void sendObject(Channel channel) {

             Command command = new Command();
             command.setActionName("链接成功");
             channel.write(command);
         }

    }

netty学习的第一天,看网上的说法,导入jboss的jar包的是netty3版本的,而io的是netty4版本的,但是我没有找到io中代替NioServerSocketChannelFactory的类和这个类,查看了api文档没有找到,希望有知道jboss.netty和io.netty区别的留言讲解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值