SpringBoot 启动运行成功,localhost无法访问连接

您所在的位置:网站首页 127001拒绝了我们的连接请求 SpringBoot 启动运行成功,localhost无法访问连接

SpringBoot 启动运行成功,localhost无法访问连接

2023-07-30 12:19| 来源: 网络整理| 查看: 265

SpringBoot 启动运行成功,localhost无法访问连接 问题描述问题的排除项目工程代码可能的原因原因的发现和锁定 问题的解决

问题描述 本项目是一个物联网项目,技术框架 SpringBoot+Netty+MySql+MybatisPlus+Swagger

今天运行SpringBoot项目过程中,项目代码没有出现报错情况,在SpringBoot初始化成功之后,在web端访问api文档时,出现了无法访问此网站——localhost拒绝连接访问请求。针对这一问题我开始进行排查解决。 浏览器拒绝访问的情况截图

问题的排除

对于这一出现的问题,我脑海中可能出现了几中假设通过这些假设,对出现问题原因的范围进行缩小。有利于进行问题排查

电脑关于网络设置出现了问题?浏览器设置出现问题?项目程序代码出现了问题

在网上针对假设1、假设2的问题我也发现了自己电脑中丢失了host文件,进行了解决之后,运行项目之后,仍然无法访问。于是开始针对本项目程序代码问题进行各种方向排查。

项目工程代码可能的原因

查询中文网站的帖子,花了一下午的时间,一 一进行排查解决,但是问题仍然没有得解决。我于是新建了一个SpringBoot工程demo ,写了一个例子发现能够在浏览器正常访问,之后在demo项目中的maven文件中加入swagger相关依赖包进行测试排查。在运行项目之后,可以正常在浏览器上访问。经过这一步可以再次缩小出现原因的范围。 图1 demo工程正常启动日志 图2 出现问题代码的SpringBoot启动日志

原因的发现和锁定

在咨询实验室同学进行讨论无果之后,我开始仔细比较demo工程和问题代码文件的异同,进行细致比较,我还怀疑是不是pom依赖包版本不兼容出现的问题。当进一步排查之后,我开始查看demo工程SpringBoot启动日志的时候与我自己出现问题的工程文件的SpringBoot启动日志进行比较。我注意到两边项目运行日志有不同。问题工程的SpringBoot的内嵌tomcat只是完成了初始化并没有实现开始启动,而且项目工程的Application也没有正式start。

于是,我根据日志的不同,对问题进行分析,因为本菜鸟的工程是一个物联网项目,需要使用Netty,同时需要开启一个端口监听下位机设备发送的数据信息。而tomcat也需要一个端口(默认8080)才能在浏览器访问。 之所以出现问题,就是因为我只开了一个线程,而且是项目工程是先完成的tcp端口数据收发,之后把项目进行tomcat部署。所以问题的原因在于,单线程的情况下,程序访问监听了TCP的端口,tomcat在初始化之后无法访问到8080端口。问题的原因就是线程。 后来百度发现这一个帖子也再一次印证了问题所在,关于SpringBoot+Netty打war包部署外部tomcat导致Tomcat不能访问的解决办法

问题的解决

原来是在项目入口原代码设置了一个监听器,完成对tcpserver的监听 netty中完成数据的接收和指令下发。

/程序入口 @SpringBootApplication @MapperScan("com.xxx.miot.mapper") //@EnableConfigurationProperties //@EnableTransactionManagement @EnableSwagger2 @ComponentScan("com.xxx.miot.*") public class MiotApplication implements CommandLineRunner { public static void main(String[] args) { SpringApplication.run(MiotApplication.class, args); } @Autowired private TcpServer server; @Override public void run(String... args) throws Exception { // 将nettyy入口整合到SpringBoot的Application 实现程序对下位机设备的监听,这也是本次问题原因所在 server.start(); } }

代码改进

//程序入口 @SpringBootApplication @MapperScan("com.aodingkun.miot.mapper") //@EnableConfigurationProperties //@EnableTransactionManagement @EnableSwagger2 @ComponentScan("com.aodingkun.miot.*") public class MiotApplication implements CommandLineRunner { public static void main(String[] args) { SpringApplication.run(MiotApplication.class, args); } @Autowired private TcpServer server; @Override public void run(String... args) throws Exception { new Thread(new TcpServer()).start();//加入一个线程启动server } }

TcpServer 的代码 加入一个线程

@Data @Slf4j @Component public class TcpServer implements Runnable { // private final static Logger logger = LoggerFactory.getLogger(Server.class); @Resource private ServerHandler serverHandler; @Value("${netty.port}") private int port; public static ServerSocketChannel serverSocketChannel; //1 第一个线程组用于接收Client 连接 EventLoopGroup bossGroup = new NioEventLoopGroup(); //2 第二个线程组用于接收实际业务 EventLoopGroup workGroup = new NioEventLoopGroup(); public void start() { try { //3 创建一个启动NIO服务的辅助启动类ServerBootstrap ServerBootstrap serverBootstrap = new ServerBootstrap(); //4 绑定两个线程组 serverBootstrap.group(bossGroup, workGroup) .channel(NioServerSocketChannel.class) //6 一定需要使用ChildHandler 去绑定那个具体事务处理器 .childHandler(new ChannelInitializer() { protected void initChannel(SocketChannel ch) throws Exception { //ch.pipeline().addLast("logging",new LoggingHandler("DEBUG"));//设置log监听器,并且日志级别为debug,方便观察运行流程 ch.pipeline().addLast("心跳", new IdleStateHandler(30, 0, 0)); ch.pipeline().addLast("encode", new ByteArrayEncoder());//编码器。发送消息时候用 ch.pipeline().addLast("decode", new MsgDecoder()); ch.pipeline().addLast("handler", serverHandler);//业务处理类,最终的消息会在这个handler中进行业务处理 } }); //8 设置TCP的缓冲区 // serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024); // 设置发送缓存大小 32k发送缓冲 // serverBootstrap.option(ChannelOption.SO_SNDBUF, 32*1024) //设置接收缓冲大小 // serverBootstrap.option(ChannelOption.SO_RCVBUF,32*1024 ) //9 保持连接长连接 serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); //10 绑定指定端口进行监听 可以绑定多个端口 ChannelFuture channelFuture = serverBootstrap.bind(port).sync(); log.info("启动加载netty"); channelFuture.channel().closeFuture().sync();//对应端口异步等待关闭 if (channelFuture.isSuccess()) { serverSocketChannel = (ServerSocketChannel) channelFuture.channel(); log.info("启动 server 成功"); System.out.println("启动 server 成功"); } else { log.info("启动失败netty"); } } catch (InterruptedException e) { System.out.println(e); } finally { bossGroup.shutdownGracefully().syncUninterruptibly(); workGroup.shutdownGracefully().syncUninterruptibly(); } } @Override public void run() { start(); } }

总结

netty在Spring中进行开发,还是有很多坑的,比如你在netty的ServerHandler中注入server会造成空指针。本次SpringBoot启动之后,无法在浏览器访问API文档,也是没有考虑到netty引入之后,端口和线程问题,希望能够引起各位用netty开发的道友的注意!



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3