netty开发socket服务核心代码

用netty开发socket服务

public void nettyMain() {
        new Thread(new Runnable() {
            public void run() {
                // 1 创建线两个程组
                // 一个是用于处理服务器端接收客户端连接的
                // 一个是进行网络通信的(网络读写的)
                EventLoopGroup bossGroup = new NioEventLoopGroup();
                EventLoopGroup workerGroup = new NioEventLoopGroup();
                try {
                    // 2 创建辅助工具类,用于服务器通道的一系列配置
                    ServerBootstrap b = new ServerBootstrap();
                    b.group(bossGroup, workerGroup);
                    b.channel(NioServerSocketChannel.class);// 指定NIO的模式
                    b.option(ChannelOption.SO_BACKLOG, 1024); // 设置tcp缓冲区
                    b.option(ChannelOption.SO_SNDBUF, 32 * 1024); // 设置发送缓冲大小
                    b.option(ChannelOption.SO_RCVBUF, 32 * 1024); // 这是接收缓冲大小
                    b.option(ChannelOption.SO_KEEPALIVE, true); // 保持连接
                    b.childHandler(new ChannelInitializer<SocketChannel>() {
                        @Override
                        protected void initChannel(SocketChannel ch) throws Exception {
                            ch.pipeline().addLast(new SelfDecoder());
                            ch.pipeline().addLast(new SelfEncoder());
                            ch.pipeline().addLast(socketProtoBufHandler);
                        }
                    });
                    // 3、绑定端口 同步等待成功
                    Integer port = 8888;
                    ChannelFuture f = b.bind(port).sync();
                    logger.info("netty启动成功。。。" + "占用tcp端口" + port);
                    // 4、等待服务端监听端口关闭
                    f.channel().closeFuture().sync();
                } catch (Exception e) {
                    logger.info("netty启动失败。。。");
                } finally {
                    workerGroup.shutdownGracefully();
                    bossGroup.shutdownGracefully();
                }
            }
        }).start();
    }

//参考http://www.wlkankan.cn/cate40/76.html

public class SocketProtoBufHandler extends ChannelInboundHandlerAdapter {
    @Autowired
    private SocketMessageProcessor messageProcessor;
    
    private final Logger log = LoggerFactory.getLogger(this.getClass());  
    
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        log.info("socket登录");
    }

    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        NettyConnectionUtil.exit(ctx);
        log.info("socket退出");
    }

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        log.info("socket读取并处理消息");
        //需要放到单独的分发器中处理
        messageProcessor.handler(ctx, msg);
        ctx.flush();
    }

    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        ctx.flush();
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        log.error("socket异常 {}", cause);
        NettyConnectionUtil.exit(ctx);
    }
    
    @Override
    public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
        NettyConnectionUtil.exit(ctx);
    }
 
}

posted @ 2020-10-13 16:00  21cm  阅读(241)  评论(0编辑  收藏  举报