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

本文介绍如何利用Netty框架在同一服务上同时处理TCP和HTTP请求。通过两种方法初始化Channel,结合TCP和HTTP请求处理器,实现高效且可靠的网络通信。
摘要由CSDN通过智能技术生成

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<SocketChannel>() {
   
//                        @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处理器一起添

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pezynd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值