Netty实战练习——傻瓜服务器

目录

 

用netty实现一个简单的“傻瓜服务器”

环境要求:

项目结构:

代码详情:

1、FoolServerHandler.java

2、FoolServer.java

运行效果:

源码地址:


用netty实现一个简单的“傻瓜服务器”

  • 将接收到的数据打印在控制台上

环境要求:

  • JDK 1.8
  • Maven 3.3.3
  • Netty 4.1

项目结构:

代码详情:

1、FoolServerHandler.java

public class FoolServerHandler extends ChannelInboundHandlerAdapter {
    public void channelRead(ChannelHandlerContext ctx, Object msg){
        //没用指定decoder和encoder,就用byteBuf来解析
        ByteBuf in = (ByteBuf) msg;
        try {
            while (in.isReadable()) {
                //将读取到的数据打印出来
                System.out.print((char) in.readByte());
                System.out.flush();
            }
        } finally {
            ((ByteBuf) msg).release();
        }
    }

    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
        cause.printStackTrace();
        ctx.close();
    }
}

2、FoolServer.java

public class FoolServer {
    int port;

    public FoolServer(int port) {
        this.port = port;
    }

    public void run() throws Exception {
        //服务端的应用,需要2个 NioEventLoopGroup
        //第一个经常被叫做boss,用来接收进来的连接。
        //第二个经常被叫做worker,用来处理已经被接收的连接,一旦‘boss’接收到连接,就会把连接信息注册到‘worker’上。
        EventLoopGroup bossGroup = new NioEventLoopGroup();
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        try {
            //启动 NIO 服务的辅助启动类
            ServerBootstrap serverBootstrap = new ServerBootstrap();
            serverBootstrap.group(bossGroup, workerGroup)
                    .channel(NioServerSocketChannel.class)
                    .childHandler(new ChannelInitializer<SocketChannel>() {
                        @Override
                        protected void initChannel(SocketChannel socketChannel) throws Exception {
                            socketChannel.pipeline().addLast(new FoolServerHandler());
                        }
                    })
                    //socket的标准参数,并不是netty自己的
                    //标识当服务器请求处理线程全满时,用于临时存放已完成三次握手的请求的队列的最大长度
                    .option(ChannelOption.SO_BACKLOG, 128)
                    //是否启用心跳保活机制
                    .childOption(ChannelOption.SO_KEEPALIVE, true);

            // 绑定端口,开始接收连接
            ChannelFuture f = serverBootstrap.bind(port).sync();

            // 等待服务器  socket 关闭
            f.channel().closeFuture().sync();

        } finally {
            workerGroup.shutdownGracefully();
            bossGroup.shutdownGracefully();
        }
    }

    public static void main(String[] args) throws Exception {
        int port;
        if (args.length > 0) {
            port = Integer.parseInt(args[0]);
        } else {
            port = 8080;
        }
        new FoolServer(port).run();
    }
}

运行效果:

源码地址:

https://github.com/tianyaning/code.git

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值