端口冲突的解决方案以及SpringBoot自动检测可用端口demo

news2024/12/23 3:57:14

端口冲突的解决方案

端口冲突通常发生在尝试运行两个或多个应用程序或服务时,它们尝试使用同一个端口号,导致系统无法正确分配资源。

各种端口错误

你是否遇到过下面这些报错信息呢?

  1. Windows 系统报错:

    系统错误 1004 
    套接字操作尝试使用一个已由另一个进程或服务占用的端口。
    
  2. Windows 系统命令提示符报错:

    The requested address is not available.
    
  3. Java 程序运行时报错:

    java.net.BindException: Address already in use: local port 8080
    
  4. Apache HTTP 服务器报错:

    AH00526: Syntax error on line 287: Could not bind to address 0.0.0.0:80 - Address already in use
    
  5. Nginx 报错:

    listen 80 failed (98: Address already in use)
    
  6. MySQL 报错:

    [Warning] Failed to start slave; MySQL error: 1130 - Host 'host' is not allowed to connect to this MySQL server
    
  7. Windows 服务管理器报错:

    The service did not start due to a logon failure.
    
  8. SpringBoot 工程启动报错:

    Web server failed to start. Port 8080 was already in use.
    

解决方案

1.Windows

  • **查看占用端口的PID
    在这里插入图片描述
    #假设我现在3000端口被占用
    netstat -ano | findstr 3000
    # 得到最后一个就是PID,也就是`18576`
    TCP    0.0.0.0:3000           0.0.0.0:0              LISTENING       18576
    
  • 查询运行程序
    在这里插入图片描述
    #根据PID,也就是上面得到的`18576`
    tasklist | findstr 18576
    # 得到第一个就是应用程序名,也就是`node.exe`
    node.exe                     18576 Console                   10    147,444 K
    

    如果此时你认识这个应用,并且它可以关闭,直接进入最后杀死进程阶段,如果你不确定,继续下一步

  • 查询程序路径
    在这里插入图片描述
    #根据应用名,也就是上面得到的`node.exe`
    wmic process where name="node.exe" get processid,executablepath
    # 得到第一个就是应用程序路径,第二个就是就是`PID`
    D:\Downloads\nodejs\node.exe  18576
    
  • 命令杀死进程
    -
    #根据PID,也就是上面得到的`18576`
    taskkill -PID 18576 -F
    
  • 任务管理器杀死进程
    在这里插入图片描述

2. Linux

# 查端口
sudo lsof -i :80
# 根据PID查程序名和路径
ps -ef | grep 1037
#杀死进程
kill -9 $PID

3. SpringBoot解决

在你的配置文件中

server
  port: 随便一个端口
  • 有没有可能让springboot自己检查端口是否别占用呢?并且给我们更换到可用端口呢?

    当然实际不要这么做,上线后端口需要固定,这只是一个锻炼思维的一个demo

  • maven导包

    <parent>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-parent</artifactId>
    	<version>2.7.12</version>
    	<relativePath/>
     </parent>
    
    
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version> <!-- 使用最新版或适合你项目的版本 -->
            <scope>provided</scope> <!-- 在编译时添加,运行时不需要 -->
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.30</version> <!-- 使用最新版或适合你项目的版本 -->
        </dependency>
    </dependencies>
    
  • application.yml

    server:
      port: 3000 #配置你的端口
    sdk:
      port:
        retry-count: 10 #尝试重试次数
        max-port: 10000 #最大端口数
        min-port: 1000 #最小端口数
    
  • 配置类

    import lombok.extern.slf4j.Slf4j;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    import java.io.IOException;
    import java.net.ServerSocket;
    import java.util.Random;
    
    /**
     * @ Author:Yang
     * @ Description:自动加载可用端口配置
     * @ create:2024-10-06-13:54
     */
    
    @Slf4j
    @Configuration
    public class PortAutoConfiguration {
        @Value("${server.port:8080}")
        private int defaultPort;
    
        @Value("${sdk.port.retry-count:10}")
        private int retryCount;
    
        @Value("${sdk.port.max-port:100000}")
        private int maxPort;
    
        @Value("${sdk.port.min-port:1000}")
        private int minPort;
    
        @Bean
        public TomcatConnectorCustomizer customServerPortTomcatConnectorCustomizer() {
        	// 尝试次数为0,则设置为0
            if (retryCount < 0) retryCount = 0;
    		// 确保最大端口不小于最小端口
            if (maxPort < minPort) maxPort = minPort;
    		
    		// 从默认端口开始寻找可用端口
            int port = findAvailablePort(defaultPort);
    
            log.info("设置端口为 port : {}", port);
    		
    		// 返回可用端口
            return connector -> connector.setPort(port);
        }
    
    
        private int findAvailablePort(int port) {
            Random random = new Random();
            //已经尝试次数
            int count = 0;
            // 这样可以保证最小为 1 ,random的最小为0
            int bound = maxPort - minPort + 1;
    
            while (count < retryCount) {
                try (ServerSocket serverSocket = new ServerSocket(port)) {
                    return port;
                } catch (IOException e) {
                    // 端口被占用,尝试下一个端口
                    int oldPort = port;
                    count++;
                    port = minPort + random.nextInt(bound);
                    log.warn("{}端口冲突,更换端口为{},已尝试{}次",oldPort,port,count);
                }
            }
    
            // 如果循环结束后仍未找到可用端口,抛出异常或返回特定值
            throw new RuntimeException("Unable to find an available port after " + retryCount + " retries");
        }
    }
    
    
  • 运行结果

    成功更换

    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2194663.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图像转3D视差视频:DepthFlow、kling

1、DepthFlow 参看: https://github.com/BrokenSource/DepthFlow 通过深度图实现图像3d效果 安装 https://brokensrc.dev/get/pypi/#installing pip insatll depthflow shaderflow broken-source pianola spectronote turbopipe 使用 1、下载项目 git clone https://gith…

约数个数约数之和

好久没发文章了.......不过粉丝还是一个没少...... 今天来看两道超级恶心的数论题目&#xff01; No.1 约数个数 No.2 约数之和 先来看第一道&#xff1a;约数个数 题目描述 给定 n 个正整数 ai​,请你输出这些数的乘积的约数个数,答案对 10^97 取模 输入格式 第一行包含…

Python_文件处理

一个完整的程序一般都包括数据的存储和读取&#xff1b;我们在前面写的程序数据都没有进行实际的存储&#xff0c;因此python解释器执行完数据就消失了。实际开发中&#xff0c;我们经常需要从外部存储介质&#xff08;硬盘、光盘、U盘等&#xff09;读取数据&#xff0c;或者将…

微信小程序开发-目录结构介绍

文章目录 一&#xff0c;目录结构介绍1&#xff0c;主体文件2&#xff0c;页面文件3&#xff0c;修改页面渲染模式 二&#xff0c;新增页面1&#xff0c;右键“pages”-新建文件夹2&#xff0c;右键文件夹-新建page3&#xff0c;新建页面的快捷方式 四&#xff0c;基础库设置 一…

①EtherNet/IP转ModbusTCP, EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关

EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关https://item.taobao.com/item.htm?ftt&id822721028899 协议转换通信网关 EtherNet/IP 转 Modbus TCP GW型号系列 MS-GW25 概述 简介 MS-GW25 是 EtherNet/IP 和 Modbus TCP 协议转换网关&#xff0c;为…

C语言 | 第十一章 | static 日期函数 数学函数

P 100 变量作用域基本规则 2023/1/9 一、基本介绍 概念&#xff1a;所谓变量作用域&#xff08;Scope&#xff09;&#xff0c;就是指变量的有效范围。 函数内部声明/定义的局部变量&#xff0c;作用域仅限于函数内部。 #include<stdio.h> void sayHello() {char nam…

【C++】—— 继承(上)

【C】—— 继承&#xff08;上&#xff09; 1 继承的概念与定义1.1 继承的概念1.2 继承定义1.2.1 定义格式1.2.2 继承父类成员访问方式的变化 1.3 继承类模板 2 父类和子类对象赋值兼容转换3 继承中的作用域3.1 隐藏规则3.2 例题 4 子类的默认成员函数4.1 构造函数4.1.1 父类有…

稀缺是否意味着价值

省流版&#xff1a;物以稀为贵。 稀少并不等于需求。 更新为&#xff1a;物以希为贵。 有需求就意味着有价值。 不管是20&#xff1a;80中的20&#xff0c;还是10&#xff1a;90中的10&#xff0c;还是2&#xff1a;98中的2。 所以&#xff0c;这个模型里一定会出现1这类人&a…

MambaAD 实验部分讲解

4 实验 4.1 设置&#xff1a;数据集、指标和细节 数据集&#xff08;6个&#xff09; 1.MVTec-AD&#xff1a; 包含5种类型的纹理和10种类型的对象&#xff0c;总共5,354张高分辨率图像。 实验&#xff1a; 3,629张正常图像被指定为训练。 剩下的 1,725 张图像被保留用于测试…

AWS MySQL 升级(三)—— TAZ - 近0停机的小版本升级方案

与AWS交流了解到的新方案&#xff0c;没有实际试过&#xff0c;所以本篇主要是些原理 一、 TAZ的含义 TAZ实际上就是 3 AZ&#xff0c;扩展一些就是 Multi-AZ DB Cluster&#xff0c;即在3个可用区部署DB&#xff0c;具备两个只读备用实例。 二、 TAZ的主要用途 1. 近0停机的小…

C++之模版进阶篇

目录 前言 1.非类型模版参数 2.模版的特化 2.1概念 2.2函数模版特化 2.3 类模板特化 2.3.1 全特化和偏特化 2.3.2类模版特化应用实例 3.模版分离编译 3.1 什么是分离编译 3.2 模板的分离编译 3.3 解决方法 4. 模板总结 结束语 前言 在模版初阶我们学习了函数模版和类…

单细胞组学大模型(6)--- LangCell,医学/细胞文本知识增强模型效果

–https://arxiv.org/abs/2405.06708 代码开源&#xff1a;https://github.com/PharMolix/OpenBioMed LangCell: Language-Cell Pre-training for Cell Identity Understanding 留意更多内容&#xff0c;欢迎关注微信公众号&#xff1a;组学之心 研究团队和研究单位 聂再清…

Python画笔案例-077 绘制 颜色饱和度测试

1、绘制 颜色饱和度测试 通过 python 的turtle 库绘制 颜色饱和度测试,如下图: 2、实现代码 绘制 颜色饱和度测试,以下为实现代码: """饱和度渐变示例,本程序需要coloradd模块支持,请在cmd窗口,即命令提示符下输入pip install coloradd进行安装。本程序演…

如何彻底掌握 JavaScript 设计模式 23 大核心模式助你提升编程水平

如何彻底掌握 JavaScript 设计模式 23 大核心模式助你提升编程水平 设计模式是解决特定问题的常用解决方案&#xff0c;它们可以帮助开发者编写更清晰、可维护、可扩展的代码。在 JavaScript 中&#xff0c;常见的设计模式可以分为三大类&#xff1a;创建型模式、结构型模式 和…

javaweb - 请求响应02

数组集合参数 数组参数&#xff1a;请求参数名与形参数组名称相同且请求参数为多个&#xff0c;定义数组类型形参即可接收参数。 RequestMapping("/arrayParam")public String arrayParam(String[] hobby) {for (String s : hobby) {System.out.println(s);}retu…

xtu oj 神经网络

回顾 Dedicated to you. AB III问题 H: 三角数问题 G: 3个数等式 数组下标查询&#xff0c;降低时间复杂度1405 问题 E: 世界杯xtu 数码串 题目 某神经网络模型是如下 1.一共有m层&#xff0c;每层都有几个神经元&#xff0c;从上到下编号为1到n。 2.第 i 层的神经元只有第 i …

基于Python的自然语言处理系列(26):Get to the Point Summarization

在本篇文章中,我们将实现经典的"Get to the Point"模型,该模型最初发表于 Get to the Point: Summarization with Pointer-Generator Networks。这是当时最著名的摘要生成模型之一,至今仍有很多人使用其Pointer-Generator架构作为他们模型的一部分。 1. 模型简介…

数据库管理-第248期 23ai:全球分布式数据库-分片数据分布方法(20241006)

数据库管理248期 2024-10-06 数据库管理-第248期 23ai&#xff1a;全球分布式数据库-分片数据分布方法&#xff08;20241006&#xff09;1 系统管理分片2 用户定义分片2.1 分片空间2.2 在用户定义分片配置中添加分片空间2.3 为用户定义分片创建表空间2.4 用户定义分片创建分片表…

AI大模型应用开发实战-AI时代应用开发破局!

后端应用级开发者该如何拥抱 AI GC&#xff1f;就是在这样的一个大的浪潮下&#xff0c;我们的传统的应用级开发者。我们该如何选择职业或者是如何去快速转型&#xff0c;跟上这样的一个行业的一个浪潮? 0 AI金字塔模型 越往上它的整个难度就是职业机会也好&#xff0c;或者说…

毒蘑菇检测数据集 9200张 14类毒蘑菇 带标注 voc yolo

毒蘑菇检测数据集 9200张 14类毒蘑菇 带标注 voc yolo 分类名: (图片张数,标注个数) Amanita citrina: (700, 816) Gyromitra infula: (842, 1102) Hygrophoropsis aurantiaca: (766, 1578) Imleria badia: (794, 1027) Lactarius turpis: (728, 891) Boletus reticulatus: (67…