• 《精通并发与Netty》学习笔记(02


    上节我们介绍了开发netty项目所必需的开发环境及工具的使用,这节我们来写第一个netty项目

    开发步骤

    第一步:打开https://search.maven.org 找到netty依赖库

    第二步:打开上节创建的项目,修改build.gradle文件如下图:

    第三步:新建类com.ssy.netty.MyServer.class

    package com.ssy.netty;
    
    import io.netty.bootstrap.ServerBootstrap;
    import io.netty.channel.ChannelFuture;
    import io.netty.channel.EventLoopGroup;
    import io.netty.channel.nio.NioEventLoopGroup;
    import io.netty.channel.socket.nio.NioServerSocketChannel;
    
    /**
     * netty作为长连接的服务器基于websoket,实现客户端与服务器端长连接。
     */
    public class MyServer {
        public static void main(String[] args) {
            //负责接收客户端连接
            EventLoopGroup bossGroup = new NioEventLoopGroup();
            //处理连接
            EventLoopGroup workerGroup = new NioEventLoopGroup();
    
            try {
                ServerBootstrap serverBootstrap = new ServerBootstrap();
                serverBootstrap.group(bossGroup,workerGroup) // 绑定线程池
                        .channel(NioServerSocketChannel.class)
                        .childHandler(new ServerInitializer());
    
                //绑定端口号
                ChannelFuture channelFuture = serverBootstrap.bind(8888).sync();
                channelFuture.channel().closeFuture().sync();
            } catch (Exception e) {
                bossGroup.shutdownGracefully();
                workerGroup.shutdownGracefully();
            }
        }
    }
    View Code

    第四步:新建ServerInitializer类

    package com.ssy.netty;
    
    import io.netty.channel.ChannelInitializer;
    import io.netty.channel.ChannelPipeline;
    import io.netty.channel.socket.SocketChannel;
    import io.netty.handler.codec.http.HttpServerCodec;
    
    /**
     * 绑定客户端连接时候触发操作
     */
    public class ServerInitializer extends ChannelInitializer<SocketChannel> {
        @Override
        protected void initChannel(SocketChannel ch) throws Exception {
            ChannelPipeline pipeline = ch.pipeline();
            //负载http 请求编码解码
            pipeline.addLast("httpServerCodec",new HttpServerCodec());
            //实际处理请求
            pipeline.addLast("httpServerHandler",new HttpServerHandler());
        }
    }

    第五步:

    package com.ssy.netty;
    
    import io.netty.buffer.ByteBuf;
    import io.netty.buffer.Unpooled;
    import io.netty.channel.ChannelHandlerContext;
    import io.netty.channel.SimpleChannelInboundHandler;
    import io.netty.handler.codec.http.*;
    import io.netty.util.CharsetUtil;
    
    /**
     * 给客户端返回字符串信息"hello world"
     */
    public class HttpServerHandler extends SimpleChannelInboundHandler<HttpObject> {
        /**
         * 该方法用于接收从客户端接收的信息
         * @param ctx
         * @param msg
         * @throws Exception
         */
        @Override
        protected void channelRead0(ChannelHandlerContext ctx, HttpObject msg) throws Exception {
            if(msg instanceof HttpRequest){
                //设置返回内容,ByteBuf是一个引用计数对象实现ReferenceCounted,他就是在有对象引用的时候计数+1,无的时候计数-1,当为0对象释放内存
                ByteBuf content = Unpooled.copiedBuffer("hello world", CharsetUtil.UTF_8);
                //创建响应
                FullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK,content);
                response.headers().set(HttpHeaderNames.CONTENT_TYPE,"text/plain");
                response.headers().set(HttpHeaderNames.CONTENT_LENGTH,content.readableBytes());
    
                ctx.writeAndFlush(response);
            }
    
        }
    }

    第六步:启动MyServer服务端,命令行执行如下语句:

    服务端返回:hello world

    netty服务端程序到此介绍完毕,下节我们一起来写客户端程序。小伙伴们,让我们拭目以待吧!

  • 相关阅读:
    linux find命令
    busybox的使用
    sql server的数据库个数、表个数及表的数据量统计
    SQL Server查看所有表大小,所占空间
    oracle数据库审计
    oracle --审计
    oracle 增量导出/导入
    MySQL下做Master/Slave同步,延迟太大怎么办?
    【MongoDB】2、安装MongoDB 2.6.1 on Unbuntu 14.04(学习流水账)
    mongodb shell之使用js(二)
  • 原文地址:https://www.cnblogs.com/happy2010/p/10884717.html
Copyright © 2020-2023  润新知