package vua.system.netty;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import vua.system.pojo.Network;
import vua.system.service.NetworkService;
import java.util.ArrayList;
import java.util.List;
/**
* Created by pxx on 2020/8/20 10:50
* netty 启动类
*/
@Component
public class ServerStart implements CommandLineRunner {
@Autowired
private NetworkService networkService;
//获取网络端口
private List<Integer> ports = new ArrayList<>();
@Override
public void run(String... args) {
try {
List<Network> works = networkService.getAllNetwork();
if (!CollectionUtils.isEmpty(works)) {
for (Network network : works) {
ports.add(network.getNetworkPort());
}
//启动
new BootNettyServer(ports).start();
}
} catch (Exception e) {
System.out.println("启动失败!");
}
}
}
package vua.system.netty;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.*;
import io.netty.channel.epoll.EpollEventLoopGroup;
import io.netty.channel.epoll.EpollServerSocketChannel;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import org.springframework.util.CollectionUtils;
import javax.annotation.PreDestroy;
import java.util.List;
/**
* 测试多端口监听服务端
* Created by pxx on 2020/8/17 13:43
*/
public class BootNettyServer {
private ChannelFuture[] ChannelFutures = null;
List<Integer> ports = null;
BootNettyServer(List<Integer> ports) {
this.ports = ports;
}
ServerBootstrap serverBootstrap = new ServerBootstrap();
private EventLoopGroup boss;
private EventLoopGroup worker;
private ChannelFuture futureTcp;
// linux平台才支持epoll
boolean epoll = false;
@PreDestroy
public void stop() {
if (futureTcp != null) {
futureTcp.channel().close().addListener(ChannelFutureListener.CLOSE);
futureTcp.awaitUninterruptibly();
boss.shutdownGracefully();
worker.shutdownGracefully();
futureTcp = null;
}
}
public void start() throws InterruptedException {
if (epoll) {
boss = new EpollEventLoopGroup();
worker = new EpollEventLoopGroup();
} else {
boss = new NioEventLoopGroup();
worker = new NioEventLoopGroup();
}
//设置监听组,线程组,初始化器
serverBootstrap.group(boss, worker)
//这个参数表示允许重复使用本地地址和端口
.childOption(ChannelOption.SO_REUSEADDR, true)
//保持连接 如果在两小时内没有数据的通信时,TCP会自动发送一个活动探测数据报文。
.childOption(ChannelOption.SO_KEEPALIVE, true)
//设置 I/O处理类,主要用于网络I/O事件,记录日志,编码、解码消息
.childHandler(new BootNettyChannelInitializer());
if (epoll) {
serverBootstrap.channel(EpollServerSocketChannel.class);
} else {
serverBootstrap.channel(NioServerSocketChannel.class);
}
try {
if (!CollectionUtil