SpringBoot整合Netty
公司是做人工智能人脸识别技术落地的,上周确定要做设备的远程控制,android端推荐使用netty,如是坑开始了~~~
第1天
netty服务的代码网上已经烂大街了,在此不赘述,但是!!!
netty服务搭建后无法保持长连接,客户端发完消息就断开连接
……
第1+n天
android大哥看不下去了
因为我用的netty4,遂推荐我使用5,本地测试没问题,整合至springBoot的时候出现版本冲突,无法解决(ps:最后发现项目用了redis,底层应该用了netty通讯),netty5卒
又回到4上,结果大哥的netty代码毫无问题,就给我用了,整合至本地没问题,废话不多说贴代码
server:
@Component
public class EchoServer implements onChannelOperation {
@Value("${netty.port}")
private int port;
private static final Logger log= LoggerFactory.getLogger(EchoServer.class);
private EventLoopGroup bossGroup = new NioEventLoopGroup();
private EventLoopGroup workerGroup = new NioEventLoopGroup();
//public List<NettyServerHandler> socketList = new ArrayList();
private static final ConcurrentHashMap<NettyServerHandler,SocketChannel> channelMap= new ConcurrentHashMap<>();
public void run() {
/* EventLoopGroup bossGroup = new NioEventLoopGroup(); // 用于处理服务器端接收客户端连接
EventLoopGroup workerGroup = new NioEventLoopGroup(); // 进行网络通信(读写)*/
try {
Thread t=Thread.currentThread();
log.info("run() in EchoServer"+ Calendar.getInstance().getTime()+"___"+t.getName());
ServerBootstrap bootstrap = new ServerBootstrap(); // 辅助工具类,用于服务器通道的一系列配置
bootstrap.group(bossGroup, workerGroup) // 绑定两个线程组, 绑定线程池
.channel(NioServerSocketChannel.class) // 指定NIO的模式
.childHandler(new ChannelInitializer<SocketChannel>() { // 配置具体的数据处理方式
@Override // 这个方法里,连接一个客户端,进入一次,连接一个客户端进入一次
protected void initChannel(SocketChannel socketChannel) throws Exception {
log.info("有客户端连接了:" + socketChannel);
// 设置超时时间,可选
// socketChannel.pipeline().addLast(new IdleStateHandler(READ_IDEL_TIME_OUT,
// WRITE_IDEL_TIME_OUT, ALL_IDEL_TIME_OUT, TimeUnit.SECONDS));
NettyServerHandler scobj = new NettyServerHandler(EchoServer.this); //设置监听
socketChannel.pipeline().addLast(scobj);
//socketList.add(scobj);
channelMap.put(scobj,socketChannel);
log.info("socket通道数量:" + "--"+channelMap.size());
}
})
.option(ChannelOption.SO_BACKLOG, 32 * 1024) // 设置TCP缓冲区
.option(ChannelOption.SO_SNDBUF, 64 * 1024) // 设置发送数据缓冲大小
.option(ChannelOption.SO_RCVBUF, 64 * 1024) // 设置接受数据缓冲大小
.childOption(ChannelOption.SO_KEEPALIVE, true); // true保持连接, false no
//.childOption(ChannelOption.ALLOW_HALF_CLOSURE, true); // 允许半关闭socket即可。默认为false,客户端shutdownoutput时,SocketChannel.read(..)
ChannelFuture future = bootstrap.bind(port).sync();
log.info("服务器启动成功,监听端口号:" + port);
future.channel().closeFuture().sync();// 关闭服务器通道
} catch (Exception e) {
e.p