You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java Web应用如何获取其运行所在服务器的端口号

你目前用InetAddress的实现只能获取服务器的IP和主机名,无法直接拿到Web容器的监听端口,因为端口是Web服务启动时由容器(Tomcat、Jetty等)绑定的,需要根据你的应用场景选择对应的实现方式:

场景1:Servlet 标准容器环境(可拿到HttpServletRequest对象)

直接通过请求对象自带方法即可获取端口,注意两个端口的区别:

  • getLocalPort():Web容器实际绑定监听的端口
  • getServerPort():用户请求URL中携带的端口(存在反向代理场景时和实际监听端口可能不同)

示例代码:

import javax.servlet.http.HttpServletRequest;
import java.net.InetAddress;

public void getServerInfo(HttpServletRequest request) throws Exception {
    // 原有获取IP、主机名逻辑
    InetAddress ip = InetAddress.getLocalHost();
    String hostname = ip.getHostName();
    String serverIp = ip.getHostAddress();

    // 获取端口
    int realListenPort = request.getLocalPort();
    int userRequestPort = request.getServerPort();

    System.out.println("服务器IP地址 : " + serverIp);
    System.out.println("服务器主机名 : " + hostname);
    System.out.println("容器实际监听端口 : " + realListenPort);
    System.out.println("用户请求目标端口 : " + userRequestPort);
}

场景2:Spring Boot 内嵌容器环境(无请求上下文时主动获取端口)

如果需要在非请求流程中获取服务启动端口,可以通过Spring的环境配置或者容器启动事件获取,即使配置了随机端口(server.port=0)也能拿到实际绑定的端口:

方式1:注入Environment直接读取

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
import java.net.InetAddress;

@Component
public class ServerInfoUtil {
    @Autowired
    private Environment env;

    public void printServerInfo() throws Exception {
        InetAddress ip = InetAddress.getLocalHost();
        String serverIp = ip.getHostAddress();
        // 优先取实际启动的端口,无则取配置端口,默认值8080
        String port = env.getProperty("local.server.port", env.getProperty("server.port", "8080"));

        System.out.println("服务器IP地址 : " + serverIp);
        System.out.println("服务启动端口 : " + port);
    }
}

方式2:监听容器启动事件获取端口

import org.springframework.boot.web.context.WebServerInitializedEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;

@Component
public class ServerPortHolder implements ApplicationListener<WebServerInitializedEvent> {
    private int serverPort;

    @Override
    public void onApplicationEvent(WebServerInitializedEvent event) {
        // 直接从容器事件中拿到实际启动端口
        this.serverPort = event.getWebServer().getPort();
    }

    public int getServerPort() {
        return serverPort;
    }
}

注意事项

  • 如果服务器存在多网卡,InetAddress.getLocalHost()可能会拿到回环地址127.0.0.1,需要遍历所有网卡接口获取对外可用的IP更准确
  • 存在Nginx等反向代理的场景,根据需求选择获取实际监听端口还是用户请求端口

内容的提问来源于stack exchange,提问作者Deepak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 23:09:04