java如何获得内网ip、外网ip、以及如何根据ip查询地址

article/2025/9/22 19:13:25

    今天突发奇想地想要用java写一个小的工具类。

    用来实现如何获得本机的内网ip,外网ip和根据ip获得相应的地址。

    花了几个小时才弄清,然后整理了一下,希望有用。

    首先要明白以下三种ip地址的区别:

    (1)127.0.0.1也就是localhost,这是本地ip地址,是只能用于本机访问本机的网络时使用的

    (2)192.168.1.1 ~ 192.168.1.255,之类的内网ip地址是用于局域网内相互访问时的ip地址

            是路由器给你分配的一个IP地址,只能在局域网中使用

    (3)还有一种就是外网IP地址,最直接的查找本机IP地址的方式就是百度:(同一路由器下的外网ip相同

                

            外网IP地址是电脑在互联网中彼此区分的一个依据,你的外网IP地址直接可以确定你的位置。

            可以直接在http://ip.taobao.com/service/getIpInfo.php?ip=后面输入ip地址来获得实际地址,

            返回的是一个jason对象

            在下面的案例中就是根据这个地址定位的。话不多说,直接上代码:

    IP地址工具类(亲测可用):(复制粘贴好之后直接运行即可)

package Util;import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.InetAddress;
import java.net.MalformedURLException;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.URL;
import java.net.URLDecoder;
import java.util.Enumeration;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;/***  * ip地址工具类*  * @author ACGkaka*  **  */
public class AddressUtils {/*** 获取本机的内网ip地址** @return* @throws SocketException*/public String getInnetIp() throws SocketException {String localip = null;// 本地IP,如果没有配置外网IP则返回它String netip = null;// 外网IPEnumeration<NetworkInterface> netInterfaces;netInterfaces = NetworkInterface.getNetworkInterfaces();InetAddress ip = null;boolean finded = false;// 是否找到外网IPwhile (netInterfaces.hasMoreElements() && !finded) {NetworkInterface ni = netInterfaces.nextElement();Enumeration<InetAddress> address = ni.getInetAddresses();while (address.hasMoreElements()) {ip = address.nextElement();if (!ip.isSiteLocalAddress() &&!ip.isLoopbackAddress() &&ip.getHostAddress().indexOf(":") == -1){// 外网IPnetip = ip.getHostAddress();finded = true;break;} else if (ip.isSiteLocalAddress() &&!ip.isLoopbackAddress() &&ip.getHostAddress().indexOf(":") == -1){// 内网IPlocalip = ip.getHostAddress();}}}if (netip != null && !"".equals(netip)) {return netip;} else {return localip;}}/*** 获取本机的外网ip地址** @return*/public String getV4IP() {String ip = "";String chinaz = "http://ip.chinaz.com";StringBuilder inputLine = new StringBuilder();String read = "";URL url = null;HttpURLConnection urlConnection = null;BufferedReader in = null;try {url = new URL(chinaz);urlConnection = (HttpURLConnection) url.openConnection();in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), "UTF-8"));while ((read = in.readLine()) != null) {inputLine.append(read + "\r\n");}//System.out.println(inputLine.toString());} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {if (in != null) {try {in.close();} catch (IOException e) {e.printStackTrace();}}}Pattern p = Pattern.compile("\\<dd class\\=\"fz24\">(.*?)\\<\\/dd>");Matcher m = p.matcher(inputLine.toString());if (m.find()) {String ipstr = m.group(1);ip = ipstr;//System.out.println(ipstr);}return ip;}/*** 解析ip地址*  * 设置访问地址为http://ip.taobao.com/service/getIpInfo.php* 设置请求参数为ip=[已经获得的ip地址]* 设置解码方式为UTF-8*  ** @param content   请求的参数 格式为:ip=192.168.1.101* @param encoding 服务器端请求编码。如GBK,UTF-8等* @return* @throws UnsupportedEncodingException*/public String getAddresses(String content, String encoding) throws UnsupportedEncodingException {//设置访问地址String urlStr = "http://ip.taobao.com/service/getIpInfo.php";// 从http://whois.pconline.com.cn取得IP所在的省市区信息String returnStr = this.getResult(urlStr, content, encoding);if (returnStr != null) {// 处理返回的省市区信息// System.out.println(returnStr);String[] temp = returnStr.split(",");if (temp.length < 3) {return "0";// 无效IP,局域网测试}String country = ""; //国家String area = ""; //地区String region = ""; //省份String city = ""; //市区String county = ""; //地区String isp = ""; //ISP公司for (int i = 0; i < temp.length; i++) {switch (i) {case 2:country = (temp[i].split(":"))[1].replaceAll("\"", "");country = URLDecoder.decode(country, encoding);// 国家break;case 3:area = (temp[i].split(":"))[1].replaceAll("\"", "");area = URLDecoder.decode(area, encoding);// 地区break;case 4:region = (temp[i].split(":"))[1].replaceAll("\"", "");region = URLDecoder.decode(region, encoding);// 省份break;case 5:city = (temp[i].split(":"))[1].replaceAll("\"", "");city = URLDecoder.decode(city, encoding);// 市区if ("内网IP".equals(city)) {return "地址为:内网IP";}break;case 6:county = (temp[i].split(":"))[1].replaceAll("\"", "");county = URLDecoder.decode(county, encoding);// 地区break;case 7:isp = (temp[i].split(":"))[1].replaceAll("\"", "");isp = URLDecoder.decode(isp, encoding); // ISP公司break;}}return new StringBuffer("地址为:" + country + ",").append(region + "省,").append(city + "市,").append(county + ",").append("ISP公司:" + isp).toString();}return null;}/*** 访问目标地址并获取返回值** @param urlStr   请求的地址* @param content  请求的参数 格式为:ip=192.168.1.101* @param encoding 服务器端请求编码。如GBK,UTF-8等* @return*/private String getResult(String urlStr, String content, String encoding) {URL url = null;HttpURLConnection connection = null;try {url = new URL(urlStr);connection = (HttpURLConnection) url.openConnection();// 新建连接实例connection.setConnectTimeout(2000);// 设置连接超时时间,单位毫秒connection.setReadTimeout(33000);// 设置读取数据超时时间,单位毫秒connection.setDoOutput(true);// 是否打开输出流 true|falseconnection.setDoInput(true);// 是否打开输入流true|falseconnection.setRequestMethod("POST");// 提交方法POST|GETconnection.setUseCaches(false);// 是否缓存true|falseconnection.connect();// 打开连接端口DataOutputStream out = new DataOutputStream(connection.getOutputStream());// 打开输出流往对端服务器写数据out.writeBytes(content);// 写数据,也就是提交你的表单 name=xxx&pwd=xxxout.flush();// 刷新out.close();// 关闭输出流BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), encoding));// 往对端写完数据对端服务器返回数据// ,以BufferedReader流来读取StringBuffer buffer = new StringBuffer();String line = "";while ((line = reader.readLine()) != null) {buffer.append(line);}reader.close();return buffer.toString();} catch (IOException e) {e.printStackTrace();} finally {if (connection != null) {connection.disconnect();// 关闭连接}}return null;}/*** 测试方法* 获取本机的内网ip,外网ip和指定ip的地址** @param args*/public static void main(String[] args) {AddressUtils addressUtils = new AddressUtils();//step1.获得内网ip和外网ip,并输出到控制台String ip1 = "";try {ip1 = addressUtils.getInnetIp(); //局域网的ip地址,比如:192.168.1.101} catch (SocketException e1) {e1.printStackTrace();}System.out.println("内网ip:" + ip1);String ip2 = addressUtils.getV4IP(); //用于实际判断地址的ipSystem.out.println("外网ip:" + ip2);//step2.根据外网ip地址,得到市级地理位置String address = "";try {address = addressUtils.getAddresses("ip=" + ip2, "utf-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}// 输出地址,比如:中国,山东省,济南市,联通System.out.println("您的" + address);System.out.println("******************************");System.out.println("请输入想要查询的ip地址(输入exit退出):");Scanner scan = new Scanner(System.in);String ip = "";while (!"exit".equals(ip = scan.next())) {try {address = addressUtils.getAddresses("ip=" + ip, "utf-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}// 输出地址,比如:中国,山东省,济南市,联通System.out.println(ip + "的" + address);System.out.println("******************************");System.out.println("请输入想要查询的ip地址(输入exit退出):");}scan.close();System.out.println("再见");}}

上面的代码最多只能定位到市级位置,下面再给大家提供两个可以对ip地址进行比较精确定位的地址:

 

网址一:http://chaipip.com/

网址二:https://www.opengps.cn/Data/IP/LocHighAcc.aspx

        

 

工具类还不是很健全,目前还在学习,欢迎各位大佬批评指正~

 


http://chatgpt.dhexx.cn/article/vGUTaQYI.shtml

相关文章

简单介绍 内网与外网IP地址,域名,子网掩码,网关与路由器,ping

IP地址 IP地址是在网络给主机分配的地址如53.159.232.5或者192.168.1.1 。具体格式就是00000000.00000000.00000000.00000000&#xff0c;32位二进制&#xff0c;平时都用十进制。 但是主机在网络上不是一个主机连一个主机&#xff0c;而是网络连接网络&#xff0c;在一个网络…

局域网固定内网IP地址的方法(亲测有效)

公司有十来台电脑&#xff0c;想要做文件共享&#xff0c;但是碍于内网IP经常变动共享文件很不方便。 网上查了一些资料&#xff0c;局域网中的电脑ip若不是设置固定的话&#xff0c;一般都是动态获取的ip&#xff0c;若是需要固定ip&#xff0c;那要如何设置呢&#xff1f; 经…

查询自己的IP地址(内网和外网)

查询自己的内网IP和外网IP的方法&#xff0c;以及判断是否直接连接到公网 本方法使用命令行&#xff0c;无需其他软件 内网IP&#xff0c;即局域网IP&#xff1a; 打开cmd窗口&#xff0c;输入 ipconfig 后回车 IPv4地址一栏下即为内网IP&#xff0c;我的电脑是192.168.3.19 顺…

192.168.和10.0.开头的IP、内网IP段、IP简介、分类——(IP观止)

在这三类地址中&#xff0c;绝大多数的IP地址都是公有地址&#xff0c;需要向国际互联网信息中心申请注册。但是在IPv4地址协议中预留了3个IP地址段&#xff0c;作为私有地址&#xff0c;供组织机构内部使用。 这三个地址段分别位于A、B、C三类地址内&#xff1a; A类地址&…

VS2019安装+IVF2020安装+abaqus2021安装+关联(亲测有效附安装包)

VS2019安装IVF2020安装abaqus2021安装关联&#xff08;亲测有效附安装包&#xff09; 0. 说明1. 安装与汉化abaqus20211.1 下载解压安装包1.2 参考以下链接的安装步骤安装1.3 安装注意事项和提示 2. VS2019安装IVF2020安装2.1 下载解压VS2019在线安装包2.2 安装配置VS20192.3 下…

abaqus一维固结模拟

初学者学习ABAQUS时&#xff0c;真可谓一头雾水&#xff0c;为什么&#xff1f; 第一因为它是全英文界面&#xff08;不过这是可以汉化的哦&#xff09;&#xff1b;第二因为它是有限元分析软件&#xff0c;俗称“CAE”即计算机辅助求解分析复杂工程&#xff08;不同于CAD即计算…

Abaqus安装在lincense server1出错

问题描述&#xff1a;LMtools显示启动成功&#xff0c;但是安装abaqus时填写过License Server1后测试链接不上 原因&#xff1a;Lincense server1中应为27011主机名&#xff08;格式不要错了&#xff09;&#xff0c;而我输入成了27500主机名&#xff08;原因是找的一个安装教程…

基于Python向Abaqus导入txt、dat数据(附abaqus中python二次开发课程)

这次推送聚焦于解决采用Python向Abaqus里导入txt、dat数据的问题&#xff08;dat文件只需要将txt文件的后缀名改为dat就可以生成dat文件&#xff09;&#xff0c;Abaqus基于Python读入txt、dat数据主要有read()、readlines()、readlines()、numpy.loadtxt()函数&#xff0c;导入…

ABAQUS后处理常用功能

ABAQUS分析完成后&#xff0c;除了看看动画&#xff0c;看看云图&#xff0c;可能还需要进行其他操作&#xff0c;此处记录自己常用的一些功能在哪设置。 使用版本6.14&#xff0c;进行了中文汉化 修改背景颜色 修改图例坐标轴标题文字大小 修改图例应力范围颜色 不显示模型上…

搅拌摩擦焊有限元仿真分析学习笔记(一)——comsol、abaqus相关案例学习

目录 COMSOL搅拌摩擦焊官方案例△ 原理及分析△ 操作流程△ 分析 ABAQUS搅拌摩擦焊有限元仿真△ 操作流程○ 创建模型○ 配置材料属性○ 模型装配○ 分析步设置○ 创建相互作用○ 创建载荷○ 划分网格○ 建立温度场○ 运算求解○ 结果与分析 △ 总结分析 ABAQUS搅拌摩擦焊CEL模…

abaqus帮助文档翻译,中英对照

abaqus2016在线帮助文档因为比较简洁&#xff0c;打开响应速度较快&#xff0c;相对于需要注册的高版本帮助文档算是一大优点。 但文档内容对于英文水平一般的同学不太友好&#xff0c;为了提高阅读效率隧寻找网页翻译的方法。 1.浏览器右键的网页翻译&#xff0c;实测无效。…

Abaqus运行脚本print时中文乱码问题

脚本打印输出时出现乱码问题 运行脚本想要直接输出位移数据&#xff0c;发现中文打印出现乱码。 #!/usr/bin/env python # -*- coding:utf-8 -*- #codingutf-8a 位移数据为:0.25555 print(a)运行上面代码出现以下情况 解决办法 将打印内容使用UTF-8解码&#xff0c;然后使…

Abaqus相关报错合集

1&#xff0c;Abaqus安装后打不开的解决办法 打开后显示错误提示&#xff08;如下图&#xff09;&#xff1a; &#xff08;如果不是此提示框&#xff0c;请尝试用右键管理员方式运行Abaqus CAE&#xff09; 解决方案 第一步&#xff1a;打开开始菜单 第二步&#xff1a;打开…

Abaqus 2022安装教程

文章目录 前言一、添加环境变量二、解压缩包三、运行.bat文件四、安装ABAQUS五、汉化六、其他可能遇到的问题&#xff1a;与UG NX12.0许可证冲突 前言 ABAQUS 2022安装包&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/127Pz2Zev8zsM5-qGE7bZgw 提取码&#xff1a;123…

abaqus软件使用笔记

abaqus 软件设置相关汉化设置工作目录修改建模时的尺寸精度导入高版本的inp文件到低版本中材料库 建模---Part建立一个实心球体球体的网格划分 后处理查看几个节点的数据美化处理图片与动画的输出 软件设置相关 汉化 用everything找到******\SIMULIA\CAE\2016\win_b64\SMA\Co…

亲测!Abaqus CAE2021插件中文乱码解决方法

博主近期在捣鼓Abaqus的插件开发&#xff0c;理论上Abaqus2021版本应该是支持中文的。但是在写插件的时候发现中文会乱码。我寻思着很奇怪啊&#xff0c;明明都支持汉化了&#xff0c;怎么插件中文的还会乱码呢&#xff1f; 一步步的Abaqus2021版本安装教程汉化操作https://bl…

一步步的Abaqus2021版本安装教程+汉化操作

一、安装包下载安装 链接&#xff1a;https://pan.baidu.com/s/1n0SajftkVXakCwJQVnuUwA 提取码&#xff1a;521u ABAQUS 是一套功能强大的工程模拟的有限元软件&#xff0c;其解决问题的范围从相对简单的线性分析到许多复杂的非线性问题。 ABAQUS 包括一个丰富的、可模拟任意…

为什么不建议将Abaqus汉化使用?

一步步的Abaqus2021版本安装教程汉化操作https://blog.csdn.net/txr152111/article/details/120659474 在上面这篇文章中&#xff0c;讲述了如何安装Abaqus2021版本以及汉化的方法&#xff0c;前期入门可以使用汉化版&#xff0c;等大致了解了之后&#xff0c;建议使用英文版&…

abaqus6.14安装教程 如何设置中文

abaqus6.14汉化版安装教程&#xff1a; 1、在本站下载解压&#xff0c;得到abaqus6.14软件包和Crack破解文件夹&#xff1b; 2、首先单击右键计算机(我的电脑)点击属性&#xff0c;查看此电脑的主机名&#xff1b; 提示&#xff1a;最好复制到记事本上&#xff0c;后面破解需要…