0

0

Netty 项目中智能获取本机 IP 的方法,提高代码可移植性

WBOY

WBOY

发布时间:2024-07-25 08:00:21

|

341人浏览过

|

来源于ITcool

转载

netty 项目中智能获取本机 ip 的方法,提高代码可移植性

人民网AIGC-X
人民网AIGC-X

国内科研机构联合推出的AI生成内容检测工具

下载

1:场景描述

在做Netty相关项目的时侯linux查看磁盘空间,我们常常须要绑定本机的IP和端标语,假如我们把它写在配置文件中linux编程获取ip,这么我们每次换笔记本运行或则布署到其他环境时侯都须要更改配置文件。这样才会比较麻烦,假如我们把它弄成智能的获取本机的IP,这样我们的代码的可移植性就增强了。下边就介绍一种在windows和linux下边可以智能获取我们本机的局域网IP和内网IP的方式linux编程获取ip,不妥之处还请你们多多指教。

2:解决方式以及代码

首先贴上获取IP的工具类

<span class="hljs-javadoc">/**
 * Copyright (C) 2015 Raxtone
 *
 *<span class="hljs-javadoctag"> @className</span>:com.test.ip.IPUtils
 *<span class="hljs-javadoctag"> @description</span>:智能判断windows&linux平台获取外网ip和局域网ip工具类
 * 注:window 获取外网IP是通过一个外部网站http://www.ip138.com/ip2city.asp
 * linux环境还需要额外的test.sh脚本(并且路径和本工具类一致)
 *<span class="hljs-javadoctag"> @version</span>:v1.0.0
 *<span class="hljs-javadoctag"> @author</span>:yunqigao
 *
 * Modification History:
 * Date Author Version Description
 * -----------------------------------------------------------------
 * 2015-3-28 yunqigao v1.0.0 create
 *
 *
 */</span>
<span class="hljs-keyword">import</span> java.io.BufferedReader;
<span class="hljs-keyword">import</span> java.io.IOException;
<span class="hljs-keyword">import</span> java.io.InputStreamReader;
<span class="hljs-keyword">import</span> java.io.LineNumberReader;
<span class="hljs-keyword">import</span> java.net.InetAddress;
<span class="hljs-keyword">import</span> java.net.URL;
<span class="hljs-keyword">import</span> java.net.UnknownHostException;
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">IPUtils</span> {</span>
<span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> String OS_NAME = <span class="hljs-keyword">null</span>;
<span class="hljs-javadoc">/**
 * 查询本机外网IP网站
 */</span>
<span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> String getWebIP = <span class="hljs-string">"http://www.ip138.com/ip2city.asp"</span>;
<span class="hljs-javadoc">/**
 * 默认值
 */</span>
<span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> String IP = <span class="hljs-string">"未知"</span>;
<span class="hljs-keyword">static</span> {
System.out.println(<span class="hljs-string">"初始化获取系统名称..."</span>);
OS_NAME = System.getProperty(<span class="hljs-string">"os.name"</span>);
}
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> String <span class="hljs-title">getIP</span>(<span class="hljs-keyword">int</span> queryFlag) {
<span class="hljs-keyword">if</span> (queryFlag == <span class="hljs-number">1</span>) {
<span class="hljs-comment">// 查询外网IP</span>
<span class="hljs-keyword">switch</span> (IPUtils.getOsType()) {
<span class="hljs-keyword">case</span> <span class="hljs-number">1</span>:
IP = IPUtils.getWinOuterIP();
<span class="hljs-keyword">break</span>;
<span class="hljs-keyword">case</span> <span class="hljs-number">2</span>:
IP = IPUtils.getLinuxIP(queryFlag);
<span class="hljs-keyword">break</span>;
<span class="hljs-keyword">default</span>:
<span class="hljs-keyword">break</span>;
}
} <span class="hljs-keyword">else</span> {
<span class="hljs-comment">// 查询内网IP</span>
<span class="hljs-keyword">switch</span> (IPUtils.getOsType()) {
<span class="hljs-keyword">case</span> <span class="hljs-number">1</span>:
IP = IPUtils.getWinInnerIP();
<span class="hljs-keyword">break</span>;
<span class="hljs-keyword">case</span> <span class="hljs-number">2</span>:
IP = IPUtils.getLinuxIP(queryFlag);
<span class="hljs-keyword">break</span>;
<span class="hljs-keyword">default</span>:
<span class="hljs-keyword">break</span>;
}
}
<span class="hljs-keyword">return</span> IP;
}
<span class="hljs-javadoc">/**
 * 获取window平台下外网IP
 * 
 *<span class="hljs-javadoctag"> @return</span> IP
 */</span>
<span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> String <span class="hljs-title">getWinOuterIP</span>() {
<span class="hljs-keyword">try</span> {
URL url = <span class="hljs-keyword">new</span> URL(getWebIP);
BufferedReader br = <span class="hljs-keyword">new</span> BufferedReader(<span class="hljs-keyword">new</span> InputStreamReader(url.openStream()));
String s = <span class="hljs-string">""</span>;
StringBuffer sb = <span class="hljs-keyword">new</span> StringBuffer(<span class="hljs-string">""</span>);
String webContent = <span class="hljs-string">""</span>;
<span class="hljs-keyword">while</span> ((s = br.readLine()) != <span class="hljs-keyword">null</span>) {
<span class="hljs-comment">//System.err.println("---"+s);</span>
sb.append(s + <span class="hljs-string">"rn"</span>);
}
br.close();
webContent = sb.toString();
<span class="hljs-keyword">int</span> start = webContent.indexOf(<span class="hljs-string">"["</span>) + <span class="hljs-number">1</span>;
<span class="hljs-keyword">int</span> end = webContent.indexOf(<span class="hljs-string">"]"</span>);
webContent = webContent.substring(start, end);
<span class="hljs-keyword">return</span> webContent;
} <span class="hljs-keyword">catch</span> (Exception e) {
<span class="hljs-comment">//e.printStackTrace();</span>
System.err.println(<span class="hljs-string">"获取外网IP网站访问失败!"</span>);
<span class="hljs-keyword">return</span> IP;
}
}
<span class="hljs-javadoc">/**
 * 获取window平台下内网IP
 * 
 *<span class="hljs-javadoctag"> @return</span> IP
 */</span>
<span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> String <span class="hljs-title">getWinInnerIP</span>() {
InetAddress[] inetAdds;
<span class="hljs-keyword">try</span> {
inetAdds = InetAddress.getAllByName(InetAddress.getLocalHost()
.getHostName());
} <span class="hljs-keyword">catch</span> (UnknownHostException e) {
e.printStackTrace();
<span class="hljs-keyword">return</span> IP;
}
<span class="hljs-keyword">return</span> inetAdds[<span class="hljs-number">0</span>].getHostAddress();
}
<span class="hljs-javadoc">/**
 * 获取linux下的IP
 *<span class="hljs-javadoctag"> @param</span> queryFlag
 * 1表示查询外网IP 2表示查询内网IP
 *<span class="hljs-javadoctag"> @return</span> IP
 *<span class="hljs-javadoctag"> @throws</span> IOException 
 */</span>
<span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> String <span class="hljs-title">getLinuxIP</span>(<span class="hljs-keyword">int</span> queryFlag) {
 LineNumberReader input = <span class="hljs-keyword">null</span>;
 String pathString = IPUtils.class.getResource(<span class="hljs-string">"/"</span>).getPath();
 <span class="hljs-comment">//类的路径</span>
 <span class="hljs-comment">//System.out.println(pathString);</span>
 Process process=<span class="hljs-keyword">null</span>;
 String line = <span class="hljs-string">""</span>;
 <span class="hljs-keyword">try</span> {
Runtime.getRuntime().exec(<span class="hljs-string">"dos2unix "</span>+pathString+<span class="hljs-string">"test.sh"</span>);
process = Runtime.getRuntime().exec(<span class="hljs-string">"sh "</span>+pathString+<span class="hljs-string">"test.sh "</span>+(queryFlag==<span class="hljs-number">1</span>?<span class="hljs-string">"1"</span>:<span class="hljs-string">"2"</span>));
InputStreamReader ir = <span class="hljs-keyword">new</span> InputStreamReader(process.getInputStream());
input = <span class="hljs-keyword">new</span> LineNumberReader(ir);
<span class="hljs-keyword">if</span>((line = input.readLine()) != <span class="hljs-keyword">null</span>) {
IP = line;
}
 } <span class="hljs-keyword">catch</span> (IOException e) {
e.printStackTrace();
System.err.println(<span class="hljs-string">"linux下获取IP失败!"</span>);
}
<span class="hljs-comment">//System.out.println("exec shell result:ip====>" + IP);</span>
<span class="hljs-keyword">return</span> IP;
}
<span class="hljs-javadoc">/**
 * 目前只支持window和linux两种平台
 * 
 *<span class="hljs-javadoctag"> @return</span> 1 window 2 linux -1:未知
 */</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">int</span> <span class="hljs-title">getOsType</span>() {
<span class="hljs-comment">// 将获取到的系统类型名称转为全部小写</span>
OS_NAME = OS_NAME.toLowerCase();
<span class="hljs-keyword">if</span> (OS_NAME.startsWith(<span class="hljs-string">"win"</span>)) {
<span class="hljs-keyword">return</span> <span class="hljs-number">1</span>;
}
<span class="hljs-keyword">if</span> (OS_NAME.startsWith(<span class="hljs-string">"linux"</span>)) {
<span class="hljs-keyword">return</span> <span class="hljs-number">2</span>;
}
<span class="hljs-keyword">return</span> -<span class="hljs-number">1</span>;
}
<span class="hljs-javadoc">/**
 * 测试方法
 * 
 *<span class="hljs-javadoctag"> @param</span> args
 *<span class="hljs-javadoctag"> @throws</span> IOException 
 */</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span>(String[] args) <span class="hljs-keyword">throws</span> IOException {
System.out.println(<span class="hljs-string">"操作系统为:"</span>+SystemOperate.fromCode(IPUtils.getOsType()+<span class="hljs-string">""</span>));
System.out.println(<span class="hljs-string">"内网IP为:"</span>+IPUtils.getIP(<span class="hljs-number">2</span>));
System.out.println(<span class="hljs-string">"外网IP为:"</span>+IPUtils.getIP(<span class="hljs-number">1</span>));
}
}

下边是一个关于操作系统类型和名称的辅助枚举类

<span class="hljs-javadoc">/**
 * Copyright (C) 2015 Raxtone
 *
 *
 *<span class="hljs-javadoctag"> @className</span>:.SystemOperate
 *<span class="hljs-javadoctag"> @description</span>:TODO
 *
 *<span class="hljs-javadoctag"> @version</span>:v1.0.0
 *<span class="hljs-javadoctag"> @author</span>:yunqigao
 *
 * Modification History:
 * Date Author Version Description
 * -----------------------------------------------------------------
 * 2015-3-28 yunqigao v1.0.0 create
 *
 *
 */</span>
<span class="hljs-keyword">import</span> java.util.Map;
<span class="hljs-keyword">import</span> java.util.HashMap;
<span class="hljs-javadoc">/**
 * 操作系统名称枚举
 * 目前只有windows 和 linux系统
 *<span class="hljs-javadoctag"> @author</span> Relieved
 *
 */</span>
<span class="hljs-keyword">enum</span> SystemOperate{
WINDOWS(<span class="hljs-number">1</span>,<span class="hljs-string">"windows系统"</span>),LINUX(<span class="hljs-number">2</span>,<span class="hljs-string">"linux系统"</span>),UNKNOWN(<span class="hljs-number">3</span>,<span class="hljs-string">"未知系统"</span>);
<span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> operateType;
<span class="hljs-keyword">private</span> String operateName;
<span class="hljs-keyword">private</span> <span class="hljs-title">SystemOperate</span>(<span class="hljs-keyword">int</span> operateType, String operateName) {
<span class="hljs-keyword">this</span>.operateType = operateType;
<span class="hljs-keyword">this</span>.operateName = operateName;
}
<span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span> <span class="hljs-title">getOperateType</span>() {
<span class="hljs-keyword">return</span> operateType;
}
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setOperateType</span>(<span class="hljs-keyword">int</span> operateType) {
<span class="hljs-keyword">this</span>.operateType = operateType;
}
<span class="hljs-keyword">public</span> String <span class="hljs-title">getOperateName</span>() {
<span class="hljs-keyword">return</span> operateName;
}
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setOperateName</span>(String operateName) {
<span class="hljs-keyword">this</span>.operateName = operateName;
}
<span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> Map lookup = <span class="hljs-keyword">new</span> HashMap();
<span class="hljs-keyword">static</span> {
<span class="hljs-keyword">for</span> (SystemOperate cp : values()) {
lookup.put(cp.getOperateType()+<span class="hljs-string">""</span>, cp);
}
}
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> String <span class="hljs-title">fromCode</span>(String code) {
<span class="hljs-keyword">return</span> lookup.get(code).operateName;
}
}

在windows系统下边直接执行工具类就可以看见右图获取到的IP

若果是在linux系统下我们还须要下边一个脚本test.sh

<span class="hljs-shebang">#!/bin/sh</span>
<span class="hljs-comment">#Copyright (C) 2015 Raxtone</span>
<span class="hljs-comment">#2015-3-28 </span>
<span class="hljs-comment">#author:yunqigao </span>
<span class="hljs-comment"># Get OS name</span>
OS=`uname`
IP=<span class="hljs-string">""</span>
<span class="hljs-comment"># store IP</span>
function <span class="hljs-function"><span class="hljs-title">getIp</span></span>(){
<span class="hljs-keyword">if</span> [ <span class="hljs-variable">$1</span> == <span class="hljs-string">"1"</span> ];<span class="hljs-keyword">then</span>
<span class="hljs-comment">#echo "outer";</span>
<span class="hljs-keyword">case</span> <span class="hljs-variable">$OS</span> <span class="hljs-keyword">in</span>
Linux) IP=`curl ifconfig.me`;;
<span class="hljs-comment">#FreeBSD|OpenBSD) IP=`ifconfig| grep -E &#039;inet.[0-9]&#039; | grep -v &#039;127.0.0.1&#039; | awk &#039;{ print $2}&#039;` ;;</span>
<span class="hljs-comment">#SunOS) IP=`ifconfig -a | grep inet | grep -v &#039;127.0.0.1&#039; | awk &#039;{ print $2} &#039;` ;;</span>
*) IP=<span class="hljs-string">"Unknown"</span>;;
<span class="hljs-keyword">esac</span>
<span class="hljs-keyword">else</span>
<span class="hljs-comment">#echo "inner";</span>
<span class="hljs-keyword">case</span> <span class="hljs-variable">$OS</span> <span class="hljs-keyword">in</span>
Linux) IP=`ifconfig| grep <span class="hljs-string">&#039;inet addr:&#039;</span>| grep -v <span class="hljs-string">&#039;127.0.0.1&#039;</span> | cut <span class="hljs-operator">-d</span>: <span class="hljs-operator">-f</span>2 | awk <span class="hljs-string">&#039;{ print $1}&#039;</span>`;;
*) IP=<span class="hljs-string">"Unknown"</span>;;
<span class="hljs-keyword">esac</span>
<span class="hljs-keyword">fi</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">"<span class="hljs-variable">$IP</span>"</span>;
}
getIp <span class="hljs-variable">$1</span>;

注:该脚本应当和工具类IPUtils置于同一目录下,不过你也可以自己定义linux 版本,自己更改路径就须要更改工具类IPUtils的getLinuxIP方式,将上面执行脚本的代码改成你脚本所在的目录即可

之后将编译后的.class文件和test.sh脚本一起拷贝到linux系统中,之后执行javaIPUtils,就可以见到如下信息!

在其他类中直接用下边的就可获取到本机的局域网和内网IP了

局域网IP为:
IPUtils<span class="hljs-preprocessor">.getIP</span>(<span class="hljs-number">2</span>))<span class="hljs-comment">;</span>
外网IP为:
IPUtils<span class="hljs-preprocessor">.getIP</span>(<span class="hljs-number">1</span>))<span class="hljs-comment">;</span>

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

870

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

30

2025.12.06

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1496

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1170

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

835

2023.08.01

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

463

2023.08.02

windows无法访问共享电脑
windows无法访问共享电脑

在现代社会中,共享电脑是办公室和家庭的重要组成部分。然而,有时我们可能会遇到Windows无法访问共享电脑的问题。这个问题可能会导致数据无法共享,影响工作和生活的正常进行。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2361

2023.08.08

windows自动更新
windows自动更新

Windows操作系统的自动更新功能可以确保系统及时获取最新的补丁和安全更新,以提高系统的稳定性和安全性。然而,有时候我们可能希望暂时或永久地关闭Windows的自动更新功能。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

874

2023.08.10

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 10.5万人学习

Git 教程
Git 教程

共21课时 | 4.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号