吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3962|回复: 6
收起左侧

[其他转载] Android开发获取内网和外网IP地址的工具类

[复制链接]
佚名RJ 发表于 2021-1-14 18:54
本帖最后由 佚名RJ 于 2021-1-15 09:11 编辑

1.添加相关权限

    <!-- 拥有完全的网络访问权限 -->
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- 查看网络连接 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

2.获取内网和外网IP地址工具类

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.URL;
import java.util.Enumeration;

/**
 * @Author: yirj
 * @Date: 2021/1/14 15:15
 * @Remark: Android开发获取内网IP地址和外网IP地址的工具类
 */
public class IpUtils {
    /**
     * 获取内网IP地址的方法
     *
     * @return
     */
    public static String getIpAddress() {
        try {
            for (Enumeration<NetworkInterface> enNetI = NetworkInterface.getNetworkInterfaces(); enNetI
                    .hasMoreElements(); ) {
                NetworkInterface netI = enNetI.nextElement();
                for (Enumeration<InetAddress> enumIpAddr = netI.getInetAddresses(); enumIpAddr.hasMoreElements(); ) {
                    InetAddress inetAddress = enumIpAddr.nextElement();
                    if (inetAddress instanceof Inet4Address && !inetAddress.isLoopbackAddress()) {
                        String aa = inetAddress.getHostAddress();
//                        System.out.println("当前内网IP测试:"+aa);
                        return inetAddress.getHostAddress();
                    }
                }
            }
        } catch (SocketException e) {
            e.printStackTrace();
        }
        return "";
    }

    /**
     * 获取外网ip地址的方法1--网页信息格式
     * @return
     */
    public static String getOutNetIP() {
        String ipAddress = "";
        try {
            String address = "http://www.3322.org/dyndns/getip"; //单独只有IP外网地址的API
//            String address = "https://ifconfig.co/json"; //json格式信息的API,使用这个自己搞代码
//            String address = "http://pv.sohu.com/cityjson?ie=utf-8"; //json格式信息的API,下面有一个使用案例。
            URL url = new URL(address);

            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setUseCaches(false);
            connection.setRequestMethod("GET");
            connection.setRequestProperty("user-agent", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.7 Safari/537.36"); //设置浏览器ua 保证不出现503

            if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
                InputStream in = connection.getInputStream();
                // 将流转化为字符串
                BufferedReader reader = new BufferedReader(new InputStreamReader(in));
                String tmpString;
                StringBuilder retJSON = new StringBuilder();
                while ((tmpString = reader.readLine()) != null) {
                    retJSON.append(tmpString + "\n");
                }
                ipAddress = retJSON.toString();
//                System.out.println("当前外网IP测试:"+ipAddress);
            } else {
                System.out.println("网络连接异常,无法获取IP地址!");
            }
        } catch (Exception e) {
        }
        return ipAddress;
    }

    /**
     * 获取外网ip地址的方法2--Json格式
     * @return
     */
    public static String GetNetIp() {
        URL infoUrl = null;
        InputStream inStream = null;
        String line = "";
        try {
            infoUrl = new URL("http://pv.sohu.com/cityjson?ie=utf-8"); //json格式信息的API,使用案例。
            URLConnection connection = infoUrl.openConnection();
            HttpURLConnection httpConnection = (HttpURLConnection) connection;
            int responseCode = httpConnection.getResponseCode();
            if (responseCode == HttpURLConnection.HTTP_OK) {
                inStream = httpConnection.getInputStream();
                BufferedReader reader = new BufferedReader(new InputStreamReader(inStream, "utf-8"));
                StringBuilder strber = new StringBuilder();
                while ((line = reader.readLine()) != null)
                    strber.append(line + "\n");
                inStream.close();
                // 从反馈的结果中提取出IP地址
                int start = strber.indexOf("{");
                int end = strber.indexOf("}");
                String json = strber.substring(start, end + 1);
                if (json != null) {
                    try {
                        JSONObject jsonObject = new JSONObject(json);
                        line = jsonObject.optString("cip");
//                        System.out.println("IP:"+line);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
                return line;
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return line;
    }
}

3.工具类测试及使用

import org.junit.Test;

/**
 * @Author: yirj
 * @Date: 2021/1/14 15:19
 * @Remark: 测试--网页信息格式获取
 */
public class IpUtilsTest {

    @Test
    public void getOutNetIP() {
        String s = IpUtils.getIpAddress();
        System.out.println("内网IP地址:" + s);
        String s1 = IpUtils.getOutNetIP();
        System.out.println("外网IP地址:" + s1);
    }
}
        /**
         * @Author: yirj
         * @Date: 2021/1/14 15:19
         * @Remark: 测试--Json格式(推荐)--可在任意位置随意调用
         */
        new Thread(new Runnable() {
            @Override
            public void run() {
                //获取内外网IP地址并输出
                String ipAddress = IpUtils.getIpAddress();
                String outNetIP = IpUtils.GetNetIp();
                System.out.println("内网IP地址:"+ipAddress+" "+"外网IP地址:"+outNetIP);
            }
        }).start();

上面代码中还有另一个返回JSON格式的API,想深入研究的小伙伴,可以根据那个再试着搞一搞!

免费评分

参与人数 2吾爱币 +2 热心值 +2 收起 理由
XiaoJY- + 1 + 1 谢谢@Thanks!
ee135 + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

coolsnake 发表于 2021-1-14 20:51
谢谢分享!
pearpear888 发表于 2021-1-18 14:16
CTQ54250 发表于 2021-3-13 12:15
感谢分享。虽然有点尴尬,但是我还想说copy就是好。我内网的用的比较多,外网的不怎么用。
sivanliu 发表于 2022-6-27 09:37
谢谢分享
江晨江 发表于 2022-7-9 11:29
收藏,收藏
头像被屏蔽
jiale625 发表于 2022-7-11 11:43
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 05:29

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表