package com.jsowell.netty.server; import com.jsowell.common.constant.Constants; import com.jsowell.netty.server.yunkuaichong.NettyServerChannelInitializer; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelOption; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioServerSocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.net.InetSocketAddress; @Slf4j @Component public class NettyServerManager implements CommandLineRunner { @Resource private NettyServerChannelInitializer nettyServerChannelInitializer; @Override public void run(String... args) throws Exception { startNettyServer(Constants.SOCKET_IP, 9011); startElectricBikeNettyServer(Constants.SOCKET_IP, 9012); } public void startNettyServer(String host, int port) { new Thread(() -> { EventLoopGroup bossGroup = new NioEventLoopGroup(1); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { ServerBootstrap bootstrap = new ServerBootstrap() .group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .handler(new LoggingHandler(LogLevel.DEBUG)) .option(ChannelOption.SO_BACKLOG, 128) .option(ChannelOption.SO_REUSEADDR, true) .childOption(ChannelOption.SO_KEEPALIVE, true) .childOption(ChannelOption.SO_REUSEADDR, true) .childHandler(nettyServerChannelInitializer) .localAddress(new InetSocketAddress(host, port)); ChannelFuture future = bootstrap.bind(port).sync(); if (future.isSuccess()) { log.info("NettyServer启动成功, 开始监听端口:{}", port); } else { log.error("NettyServer启动失败", future.cause()); } future.channel().closeFuture().sync(); } catch (Exception e) { log.error("NettyServer.start error", e); bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); } }).start(); } public void startElectricBikeNettyServer(String host, int port) { new Thread(() -> { EventLoopGroup bossGroup = new NioEventLoopGroup(1); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { ServerBootstrap bootstrap = new ServerBootstrap() .group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .handler(new LoggingHandler(LogLevel.DEBUG)) .option(ChannelOption.SO_BACKLOG, 128) .option(ChannelOption.SO_REUSEADDR, true) .childOption(ChannelOption.SO_KEEPALIVE, true) .childOption(ChannelOption.SO_REUSEADDR, true) .childHandler(nettyServerChannelInitializer) .localAddress(new InetSocketAddress(host, port)); ChannelFuture future = bootstrap.bind(port).sync(); if (future.isSuccess()) { log.info("ElectricBikeNettyServer启动成功, 开始监听端口:{}", port); } else { log.error("ElectricBikeNettyServer启动失败", future.cause()); } future.channel().closeFuture().sync(); } catch (Exception e) { log.error("ElectricBikeNettyServer.start error", e); bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); } }).start(); } }