基于Netty实现TCP服务和HTTP服务

1 简介

Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。目前Netty已被各大厂商、机构作为网络通信基础组件所使用。
本篇文章介绍使用Netty同时启动TCP服务和HTTP服务,从而实现一个服务(一个端口)即能处理TCP请求,又能处理HTTP请求。具体要根据自己的需求来选择是否要这要做,分开解耦也是一个不错的选择。都可参考下面的实现方式。

2 启动netty服务

2.1 main方法入口

@SpringBootApplication
public class StartServer {
   

    @Bean
    public RestTemplate restTemplate() {
   
        return new RestTemplate();
    }

    public static void main(String[] args) {
   
        ApplicationContext context = new SpringApplicationBuilder(StartServer.class)
                .web(WebApplicationType.SERVLET)
                .run(args);
        NettyServer server = context.getBean(NettyServer.class);
        server.run();
    }
}

2.2 启动netty服务

@Slf4j
@Service
public class NettyServer {
   
    @Autowired
    private NettyConfig.NettyServerConfig nettyServerConfig;

    @Autowired
    private ChannelInit channelInit;

    public void run(){
   
        int port = nettyServerConfig.getTcpPort();
        EventLoopGroup bossGroup = null;
        EventLoopGroup workGroup = null;
        try {
   
            ServerBootstrap b = new ServerBootstrap();
            if (Epoll.isAvailable()) {
   
                bossGroup = new EpollEventLoopGroup();
                workGroup = new EpollEventLoopGroup();
            }else{
   
                bossGroup = new NioEventLoopGroup();
                workGroup = new NioEventLoopGroup();
            }
            b.group(bossGroup, workGroup)
                    .channel(Epoll.isAvailable() ? EpollServerSocketChannel.class : NioServerSocketChannel.class)
                    .option(ChannelOption.SO_BACKLOG, 128) // 指定服务队列长度
                    .option(ChannelOption.SO_REUSEADDR, true) // 忙时允许重用TIME_WAIT状态的端口
                    .option(ChannelOption.SO_KEEPALIVE, true) // 关闭TCP自带的保活机制
                    .childOption(ChannelOption.TCP_NODELAY, true) // 关闭Nagle算法
//                    .childOption(ChannelOption.SO_SNDBUF, nettyServerConfig.getSendBufferSize()) // 发送缓冲区大小
//                    .childOption(ChannelOption.SO_RCVBUF, nettyServerConfig.getRecvBufferSize()) // 接收缓冲区大小
                    .option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT) // 内存池 需要显示调用release释放
                    // 容量动态调整的接收缓冲区分配器 默认值
                    // .option(ChannelOption.RCVBUF_ALLOCATOR, AdaptiveRecvByteBufAllocator.DEFAULT)
//                    .childHandler(new ChannelInitializer() {
   
//                        @Override
//                        protected void initChannel(SocketChannel socketChannel) throws Exception {
   
//                            socketChannel.pipeline().addLast(new NettyServerHandle());
//                        }
//                    });
                    .handler(new LoggingHandler(LogLevel.INFO))
                    .childHandler(channelInit);

            ChannelFuture future = b.bind(port).sync();

            log.info("nettyServer run success,TCP-PORT:{}", port);

            // 等待socket被关闭
            future.channel().closeFuture().sync();
        } catch (InterruptedException e) {
   
            e.printStackTrace();
        } finally {
   
            bossGroup.shutdownGracefully();
            workGroup.shutdownGracefully();
        }
    }
}

3 启动TCP服务和HTTP服务(方法一)

3.1 Channel初始化

在ChannelInitializer时,将TCP和HTTP的ChannelHandler处理器一起添

你可能感兴趣的:(大数据杂谈,心得分享,netty,java,tcp,http)