欢迎光临
我们一直在努力

UCloud云社区java-netty-study-2-netty 服务端

Netty 服务端编写
1、bootStrap 部分

        final Bootstrap bootstrap = new ServerBootstrap();
        ExecutorService boss = Executors.newCachedThreadPool();
        ExecutorService worker = Executors.newCachedThreadPool();
        bootstrap.setFactory(new NioServerSocketChannelFactory(boss, worker));
        bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
            public ChannelPipeline getPipeline() throws Exception {
                
                final ChannelPipeline pipeline = Channels.pipeline();
                pipeline.addLast("decoder", new StringDecoder());
                pipeline.addLast("encoder",new StringEncoder());
                pipeline.addLast("messageHandler",new ServerHandler());
                return pipeline;
            }
        });
        
        ((ServerBootstrap) bootstrap).bind(new InetSocketAddress(10101));

代码说明

1.1 boss VS worker

boss和worker的线程

boss和worker 里面都是一个线程分配一个Selector。

boss和worker的功能

boss的功能主要是处理连接,worker的功能是Channel的读写

2、客户端部分
2.1 handler继承父类

2.2 Handler 常用方法说明
2.2.1 messageReceived

        //1、接收数据
        /*
        没有StringDecoder时,显示字符串消息
        final ChannelBuffer message = (ChannelBuffer) e.getMessage();
        final byte[] array = message.array();
        final String msg = new String(array);
        System.out.println("message is :" + msg);
        */
        //有StringDecoder
        System.out.println(e.getMessage());
        //2、返回数据
        //返回数据给客户端
        /*
        没有StringEnCoder
        final ChannelBuffer channelBuffer = ChannelBuffers.copiedBuffer("hi, i'm 
        server".getBytes());
        ctx.getChannel().write(channelBuffer);
        */
        //有StringEnCoder
        ctx.getChannel().write("hi, i'm server");
        //3、抛出异常,看exceptionCaught 方法
        //System.out.println(1/0);
        super.messageReceived(ctx, e)

代码说明

关于StringEncoder,和StringDecoder
在Server中添加了上述的encoder和decoder,我们就可以直接接收和返回String类型的数据给客户端。看类的继承关系:


截图说明
Netty 中和客户端的数据传输有个上行和下行,UpStream,DownStream. 我们注意到Handler的父类中也同时继承了这两个类。

-功能1

 接收客户端的数据

-功能2

 返回数据给客户端

-功能3

 可以在这个方法里监控一个客户端每秒发送了多少请求,避免恶意的客户端攻击。可以获取客户端ip,调用Channel的close方法关闭连接。

备注:
接收和返回数据异常,会调用exceptionCaught

2.2.2 exceptionCaught

功能1
messageReceived方法处理数据抛出异常,这个方法会调用

2.2.3 channelConnected

功能1

一个用户连接了,加载这个用户的相关数据到缓存中

2.2.4 channelDisconnected VS channelClosed

功能1

比如做游戏,一个玩家上线了,建立连接,我们就要把玩家的一些数据读取到缓存(redis/memcached)中,当玩家下线了,这两个方法调用,那么清空缓存中的数据。
赞(0)
未经允许不得转载:优乐评测网 » UCloud云社区java-netty-study-2-netty 服务端

优乐评测网 找服务器 更专业 更方便 更快捷!

联系我们联系我们