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处理器一起添