0

0

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

WBOY

WBOY

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

|

341人浏览过

|

来源于ITcool

转载

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

Originality AI
Originality AI

专门为网络出版商设计的抄袭和AI检测工具

下载

1:场景描述

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

2:解决方式以及代码

首先贴上获取IP的工具类

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

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

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

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

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

#!/bin/sh
#Copyright (C) 2015 Raxtone
#2015-3-28 
#author:yunqigao 
# Get OS name
OS=`uname`
IP=""
# store IP
function getIp(){
if [ $1 == "1" ];then
#echo "outer";
case $OS in
Linux) IP=`curl ifconfig.me`;;
#FreeBSD|OpenBSD) IP=`ifconfig| grep -E 'inet.[0-9]' | grep -v '127.0.0.1' | awk '{ print $2}'` ;;
#SunOS) IP=`ifconfig -a | grep inet | grep -v '127.0.0.1' | awk '{ print $2} '` ;;
*) IP="Unknown";;
esac
else
#echo "inner";
case $OS in
Linux) IP=`ifconfig| grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1}'`;;
*) IP="Unknown";;
esac
fi
echo "$IP";
}
getIp $1;

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

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

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

局域网IP为:
IPUtils.getIP(2));
外网IP为:
IPUtils.getIP(1));

相关专题

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

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

468

2024.01.03

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

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

13

2025.12.06

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

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

689

2023.07.26

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

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

1128

2023.07.27

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

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

799

2023.08.01

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

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

454

2023.08.02

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

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

2351

2023.08.08

windows自动更新
windows自动更新

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

823

2023.08.10

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

41

2026.01.23

热门下载

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

精品课程

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

共48课时 | 7.7万人学习

Git 教程
Git 教程

共21课时 | 2.9万人学习

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

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