JAVA 篇net 之Inet4Address、Inet6Address、URL、URLConnection、HttpURLConnection

本文详细介绍了JAVA中与网络连接相关的类,包括Inet4Address、Inet6Address和InetAddress的使用,以及如何通过URL、URLConnection和HttpURLConnection进行网络通信。通过示例代码展示了从获取IP地址到发起HTTP请求的完整过程。

为什么要说介绍这几个类,是因为我们在工作中会接触到通过客服端调用的方式

1、Inet4Address、Inet6Address、InetAddress

这两个类主要链接远程机器用的,父类是InetAddress,先来看看是怎么实现拿到机器的ip地址的

public InetAddress[] lookupAllHostAddr(String var1) throws UnknownHostException {
    String[] var2 = new String[]{"A", "AAAA", "CNAME"};

    DirContext var3;
    try {
        var3 = this.getTemporaryContext();   //获取dns目录树对应的所有和此域名的内容
    } catch (NamingException var13) {
        throw new Error(var13);
    }
    ..........
}

上面这个方法是在DNSNameService里面的,主要是用来查找域名对应的ip地址(多个)

2、URL、URLConnection、HttpURLConnection

为什么要将上面的InetAddress类,主要是想大家了解完整的一个过程(如下图)

100058_3ElI_2663859.png

接下来主要讲下URL、URLConnection、HttpURLConnection 首先给出一段代码

URL url = new URL("http://localhost:8080/web/test/write");   //解析url路径,验证url格式(比如协议等等)
HttpURLConnection urlConnection = null;
StringBuilder stringBuilder = new StringBuilder();
try {
    urlConnection  = (HttpURLConnection) url.openConnection();//创建连接对象(这里有很多协议,我们看
HttpUrlConnection这个)

    urlConnection.setRequestMethod("POST"); //设置对象的链接属性
    urlConnection.setRequestProperty("ContentType","application/json;charset:utf-8");
    int code = urlConnection.getResponseCode();//重要,这里是真正的建立和远程服务器的链接(里面保护和发现机器
ip地址等方法,其实就是实现了InetAddress的方法)
    if(code!=200)
        return;

    try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), Charset.forName("utf-8"))); ){
        String rep = null;
        while ((rep = bufferedReader.readLine())!=null){
            stringBuilder.append(new String (rep));
        }
    }catch (Exception e){
        e.printStackTrace();
    }
    System.out.println(urlConnection.getHeaderFields());
    System.out.println(stringBuilder.toString());
}catch (Exception e){
    e.printStackTrace();
}finally {
    if(urlConnection!=null)
        urlConnection.disconnect();
}

转载于:https://my.oschina.net/chenping12/blog/1491937

<think>我们正在回答用户关于JavaInet4AddressInet6Address区别的问题。根据引用的资料,我们可以总结如下:1.**类的继承关系**:-`Inet4Address`和`Inet6Address`都是`InetAddress`的子类。-`Inet4Address`用于表示IPv4地址,而`Inet6Address`用于表示IPv6地址。2.**表示地址类型**:-IPv4地址长度为32位(4字节),通常以点分十进制表示(如`192.168.1.1`)。-IPv6地址长度为128位(16字节),通常以冒号分隔的十六进制表示(如`2001:0db8:85a3:0000:0000:8a2e:0370:7334`)。3.**判断地址类型的方法**:-根据引用[4],可以通过检查字节数组的长度来判断:-IPv4地址的字节数组长度为4,IPv6为16。-或者使用`instanceof`操作符:```javaif(addressinstanceofInet4Address){//IPv4地址处理}elseif(addressinstanceofInet6Address){//IPv6地址处理}```4.**使用方式**:-通常我们通过`InetAddress`的静态方法(如`getByName()`)获取实例,然后根据实际类型进行转换或判断。-示例代码(根据引用[4]修改):```javaInetAddressaddress=InetAddress.getByName("www.example.com");if(address.getAddress().length==4){System.out.println("IPv4地址");}elseif(address.getAddress().length==16){System.out.println("IPv6地址");}```5.**注意事项**:-在同时支持IPv4和IPv6的环境中,域名可能解析到多个地址(包括IPv4和IPv6)。-通过`InetAddress.getAllByName()`可以获取所有地址。综上所述,`Inet4Address`和`Inet6Address`的主要区别在于它们所表示的IP地址版本不同,分别对应IPv4和IPv6。在实际编程中,我们通常通过`InetAddress`类的方法获取地址实例,再根据实际需要判断或转换类型。下面生成相关问题:</think> ### JavaInet4AddressInet6Address的区别及用法 #### 一、核心区别对比 | 特性 | Inet4Address | Inet6Address | |--------------|----------------------------------|----------------------------------| | **地址长度** | 32位(4字节) | 128位(16字节) | | **地址格式** | 点分十进制(如`192.168.1.1`) | 冒号分隔十六进制(如`2001:db8::1`) | | **所属协议** | IPv4 | IPv6 | | **继承关系** | `InetAddress`的子类 | `InetAddress`的子类 | | **典型用法** | 传统网络应用 | 新一代互联网应用 | #### 二、关键差异详解 1. **地址表示能力** - `Inet4Address`:最多支持$2^{32}$个地址(约43亿),使用4字节存储 - `Inet6Address`:支持$2^{128}$个地址(约$3.4 \times 10^{38}$),使用16字节存储,解决IPv4地址耗尽问题[^1] 2. **特殊功能支持** IPv6专属特性(仅`Inet6Address`支持): ```java // 获取IPv6作用域 NetworkInterface scope = inet6Address.getScopedInterface(); // 检查是否链路本地地址 boolean isLinkLocal = inet6Address.isLinkLocalAddress(); ``` 3. **类型判断方法** ```java InetAddress address = InetAddress.getByName("example.com"); // 方法1:通过instanceof判断 if (address instanceof Inet4Address) { System.out.println("IPv4地址"); } else if (address instanceof Inet6Address) { System.out.println("IPv6地址"); } // 方法2:通过字节长度判断 byte[] bytes = address.getAddress(); if (bytes.length == 4) { // IPv4 // ... } else if (bytes.length == 16) { // IPv6 // ... } ``` #### 三、使用示例 **获取IP地址对象**: ```java // 创建IPv4地址 Inet4Address ipv4 = (Inet4Address) Inet4Address.getByName("192.168.1.1"); // 创建IPv6地址 Inet6Address ipv6 = (Inet6Address) Inet6Address.getByName("2001:db8:85a3::8a2e:370:7334"); ``` **域名解析(双栈支持)**: ```java InetAddress[] addresses = InetAddress.getAllByName("google.com"); for (InetAddress addr : addresses) { if (addr instanceof Inet4Address) { System.out.println("IPv4: " + addr.getHostAddress()); } else if (addr instanceof Inet6Address) { System.out.println("IPv6: " + addr.getHostAddress()); } } // 输出可能同时包含IPv4和IPv6地址 ``` #### 四、注意事项 1. **兼容处理** 当系统启用双栈支持时,域名解析可能返回两种地址类型,需做好兼容: ```java // 优先使用IPv4地址 Arrays.stream(addresses) .filter(a -> a instanceof Inet4Address) .findFirst() .orElse(addresses[0]); ``` 2. **文本表示差异** IPv6地址需处理压缩格式(如`::`)和可选端口号: ```java String ipv6String = ipv6.getHostAddress(); // 2001:db8::1 ``` 3. **作用域限定** IPv6地址可能关联网络接口: ```java NetworkInterface ni = NetworkInterface.getByName("eth0"); Inet6Address scopedAddr = Inet6Address.getByAddress( "host", ipv6Bytes, ni ); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值