package com.zy.core.netty;
|
|
|
import com.zy.core.netty.properties.TcpProperties;
|
import io.netty.bootstrap.ServerBootstrap;
|
import io.netty.buffer.PooledByteBufAllocator;
|
import io.netty.channel.Channel;
|
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.util.ResourceLeakDetector;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Component;
|
|
import javax.annotation.PostConstruct;
|
import javax.annotation.PreDestroy;
|
|
/**
|
* TCP/IP协议端口
|
* Netty Server 引导类
|
* @author Vincent
|
*/
|
@Slf4j
|
@Component
|
public class OnlineServer {
|
|
private final HandlerInitializer handlerInitializer;
|
private final TcpProperties tcpProperties;
|
private Channel channel;
|
private ServerBootstrap bootstrap;
|
private EventLoopGroup bossGroup;
|
private EventLoopGroup workerGroup;
|
|
{
|
bootstrap = new ServerBootstrap();
|
bossGroup = new NioEventLoopGroup(1);
|
workerGroup = new NioEventLoopGroup();
|
}
|
|
@Autowired
|
public OnlineServer(TcpProperties tcpProperties, HandlerInitializer handlerInitializer) {
|
;
|
this.tcpProperties = tcpProperties;
|
this.handlerInitializer = handlerInitializer;
|
}
|
|
/**
|
* tcp server init
|
*/
|
@PostConstruct
|
public void serverStart() throws Exception {
|
// 开启大端模式
|
// CStruct.reverse = false;
|
|
bootstrap.group(bossGroup, workerGroup)
|
.channel(NioServerSocketChannel.class)
|
.childHandler(handlerInitializer)
|
.option(ChannelOption.SO_BACKLOG, tcpProperties.getBacklog())
|
.option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT)
|
.childOption(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT)
|
.childOption(ChannelOption.SO_KEEPALIVE, tcpProperties.isKeepAlive())
|
.childOption(ChannelOption.SO_SNDBUF, tcpProperties.getSndbuf())
|
.childOption(ChannelOption.SO_RCVBUF, tcpProperties.getRcvbuf());
|
|
ResourceLeakDetector.setLevel(ResourceLeakDetector.Level.ADVANCED);
|
|
log.info("TCP server started successfully, port:{}", tcpProperties.getPort());
|
|
channel = bootstrap.bind(tcpProperties.getPort()).sync().channel();
|
}
|
|
|
/**
|
* tcp server stop
|
*/
|
@PreDestroy
|
public void destroy() {
|
if (channel != null && channel.isActive()) {
|
channel.close();
|
}
|
if (bossGroup != null) {
|
bossGroup.shutdownGracefully();
|
}
|
if (workerGroup != null) {
|
workerGroup.shutdownGracefully();
|
}
|
log.info("TCP server stopped successfully, port: {}", tcpProperties.getPort());
|
}
|
|
}
|