前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JAVA 和python 多网卡情况下获取正确的IP地址

JAVA 和python 多网卡情况下获取正确的IP地址

作者头像
JadePeng
发布2023-10-16 18:56:29
2500
发布2023-10-16 18:56:29
举报

要获取内网地址,可以尝试连接到10.255.255.255:1。如果连接成功,获取本地套接字的地址信息就是当前的内网IP。

python实现:

代码语言:javascript
复制
import socket

def extract_ip():
    st = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    try:
        st.connect(('10.255.255.255', 1))
        IP = st.getsockname()[0]
    except Exception:
        IP = '127.0.0.1'
    finally:
        st.close()
    return IP

Java:

代码语言:javascript
复制
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

/**
 * 网络工具
 * @author jqpeng
 */
public class NetUtils {

    public static void main(String[] args) throws UnknownHostException {
        InetAddress localHost = InetAddress.getLocalHost();
        System.out.println(localHost.getHostAddress());

        System.out.println("----------------下面才是正确的获取方式----------------");
        localHost = getLocalHostExactAddress();
        System.out.println(localHost.getHostAddress());
        // System.out.println(localHost.getHostName());
    }


    public static InetAddress getLocalHostExactAddress() {
        try {
            DatagramSocket socket = new DatagramSocket();
            socket.connect(InetAddress.getByName("10.255.255.255"), 1);
            InetAddress address = socket.getLocalAddress();
            socket.close();
            return address;
        } catch (UnknownHostException | SocketException e) {
            try {
                return InetAddress.getLocalHost();
            } catch (UnknownHostException ex) {
                throw new RuntimeException(ex);
            }
        }
    }

}

在java里,为了解决eureka获取client ip错误问题,可以重写InetUtils

代码语言:javascript
复制
/**
 * 自定义InetUtils,重写findFirstNonLoopbackAddress方法,解决获取IP错误
 * @author jqpeng
 */
@Slf4j
public class CustomInetUtils extends InetUtils {

    public CustomInetUtils(InetUtilsProperties properties) {
        super(properties);
        log.info(properties.toString());
        log.info("CustomInetUtils init");
    }

    @Override
    public InetAddress findFirstNonLoopbackAddress() {
        log.info("CustomInetUtils.findFirstNonLoopbackAddress");
        return NetUtils.getLocalHostExactAddress();
    }
}

用上面的类替换InetUtils :

代码语言:javascript
复制
    @Bean
    public InetUtils inetUtils(InetUtilsProperties inetUtilsProperties){
        // 内网ip
        inetUtilsProperties.setUseOnlySiteLocalInterfaces(true);
        return new CustomInetUtils(inetUtilsProperties);
    }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-07-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档