写点什么

Java 网络编程之 InetAddress 类详解,URL 和 URI 的区别,URLDecoder 和 URLEncoder,IPv6 和 IPv4 区别,IPv6 的三种表示方法

作者:共饮一杯无
  • 2022 年 9 月 05 日
    浙江
  • 本文字数:3455 字

    阅读完需:约 11 分钟

Java网络编程之InetAddress类详解,URL和URI的区别,URLDecoder和URLEncoder,IPv6和IPv4区别,IPv6的三种表示方法

InetAddress

Java 提供了 InetAddress 类来代表 IP 地址,InetAddress 下还有两个子类:Inet4AddressInet6Address,它们分别代表 Internet Protocol version 4(IPv4)地址和 Internet Protocol version 6(IPv6)地址。InetAddress 常用方法:验证是否可达:


  • boolean isReachable(int timeout):等价于 isReachable(null, 0 , timeout)

  • boolean isReachable(NetworkInterface netif, int ttl, int timeout):测试该地址是否可达。

  • netif – 将通过其完成测试的 NetworkInterface,或者为任何接口为 null

  • ttl – 要尝试的最大跳数或默认值为 0,负值将导致抛出 IllegalArgumentException。

  • timeout – 超时值(以毫秒为单位)指示尝试应花费的最长时间。 如果操作在得到应答前超时,则认为主机不可达。负值将导致抛出 IllegalArgumentException。


获取 InetAddress 实例:


  • getByName(String host):根据主机获取对应的 InetAddress 对象实例。

  • getByAddress(byte[] addr):根据原始 IP 地址 来 获取对应的 InetAddress 对象实例。


获取 InetAddress 实例对应的 IP 地址和主机名:


  • String getHostName():获取此 IP 地址的主机名 。

  • String getCanonicalHostName():获取此 IP 地址的全限定域名 。

  • String getHostAddress():返回该 InetAddress 实例对应的 IP 地址字符串(以字符串形式)。

  • byte[] getAddress():获取原始 IP 地址。


其他:


  • boolean isMulticastAddress():检查 InetAddress 是否为 IP 多播地址的实用程序例程。

  • IP v4 多播地址是 D 类地址,即地址的前四位是 1110;

  • IPv6 地址开头的 11111111 将该地址标识为多播地址。

  • boolean isAnyLocalAddress():检查 InetAddress 是否为通配符地址的实用程序例程。

  • boolean isLoopbackAddress():用于检查 InetAddress 是否为回环地址的实用程序。(127.x.x.x)

  • boolean isLinkLocalAddress():检查 InetAddress 是否为链路本地地址的实用程序例程。(169.254.0.0/16)


代码案例如下:


    public void inetAddressTest() throws IOException {        // 根据域名来获取对应的InerAddress实例        InetAddress ip = InetAddress.getByName("www.baidu.com");        // 判断是否可达        System.out.println("百度是否可达:" + ip.isReachable(2000));        // 获取该InetAddress实例的IP字符串        System.out.println(ip.getHostAddress());        //获取主机名(域名)        System.out.println(ip.getHostName());        //获取原始 IP 地址        System.out.println(ip.getAddress());        // 获取该InetAddress实例对应的全限定域名        //System.out.println(ip.getCanonicalHostName());        // 根据原始IP地址来获取对应的InetAddress实例        InetAddress local = InetAddress.getByAddress(new byte[] { 127, 0, 0, 1 });        System.out.println("本机是否可达:" + local.isReachable(1000));    }
复制代码

URL 和 URI

  1. URL 是全球资源定位符的英文所写,在浏览器中输入的地址就是 URL。比如:https://blog.csdn.net/qq_35427589/article/details/124088153就是一个 URL。


URL 包含以下信息:


  • 用于访问资源的协议

  • 服务器的位置(无论是通过 IP 地址还是域名)

  • 服务器上的端口号(可选)

  • 资源在服务器目录结构中的位置

  • 片段标识符(可选)


  1. URI 是 Web 上可用的每种资源 - HTML 文档、图像、视频片段、程序,由一个通过通用资源标志符(Universal Resource Identifier, 简称"URI")进行定位。

URL 和 URI 差别

  • URL(统一资源定位符)主要用于链接网页,网页组件或网页上的程序,借助访问方法(http,ftp,mailto 等协议)来检索位置资源。

  • URI 是一个相对来说更广泛的概念。URL 是 URI 的一种,是 URI 命名机制的一个子集,能够说 URI 是抽象的,而详细要使用 URL 来定位资源。

  • Web 上的每一种资源如:图片、文档、视频等,都是由 URI 定位的。这里所谓的定位指的是 web 上的资源相对于主机 server 来说,存放在 server 上的详细路径。

  • URL 是 internet 上用来描写叙述信息资源文件的字符串。用在客户程序和 server 上,定位客户端连接 server 所须要的信息,它不仅定位了这个信息资源,并且定义了怎样找到这个资源。

  • URL 指定要使用的协议类型,而 URI 不涉及协议规范。


java.net.URL常用构造函数和方法:构造函数:URL(String url):根据 url 构建一个 URL 对象URL(String protocol, String host, int port, String file):创建一个 URL 从指定对象 protocol,host,port 号码,和 file。方法:String getFile():获取此文件的名称 URL。String getHost():获取此主机名(URL 如果适用)。String getPath():获取此部分的路径部分 URL。int getPort():获取此 URL 的端口号。

URLDecoder 和 URLEncoder

URLDecoder 和 URLEncoder 的作用主要是用于普通字符串和 application/x-www-form-rulencoded MIME 字符串之间的转换 URLDecoder 类包含一个decode(String s,String charcter)静态方法,它可以将看上去乱码的特殊字符串转换成普通字符串。URLEncoder 类包含一个encode(String s,String charcter)静态方法,它可以将普通字符串转换成 application/x-www-form-urlencoded MIME 字符串。代码案例:


    public  void URLDecoderURLEncoderTest() throws UnsupportedEncodingException {        //将application/x-www-form-urlencoded字符串转换成普通字符串        String decode = URLDecoder.decode("https://blog.csdn.net/qq_35427589/article/details/122321132?ops_request_misc=&request_id=&biz_id=102&utm_term=%E5%85%B1%E9%A5%AE%E4%B8%80%E6%9D%AF%E6%97%A0", "UTF-8");        System.out.println("urlDecode:"+decode);        //将普通字符串转换成application/x-www-form-urlencoded字符串        String encode = URLEncoder.encode("共饮一杯无" , "UTF-8");        System.out.println("urlEncode:"+encode);    }
复制代码


输出如下:urlDecode:https://blog.csdn.net/qq_35427589/article/details/122321132?ops_request_misc=&request_id=&biz_id=102&utm_term=共饮一杯无urlEncode:%E5%85%B1%E9%A5%AE%E4%B8%80%E6%9D%AF%E6%97%A0

扩展资料

Internet Protocol version 4(IPv4)地址和 Internet Protocol version 6(IPv6)

在电脑的控制面板网络连接中可以看到 IPv4 和 IPv6 的存在。



  • IPv6 和 IPv4 都是“互联网协议”,IPv6 是用于替代 IP 协议(IPV4)的下一代 IP 协议。

  • IPv6 的使用,不仅能解决网络地址资源数量的问题,而且也解决了多种接入设备连入互联网(物联网)的障碍。

  • 由于 IPv4 最大的问题在于网络地址资源不足,严重制约了互联网的应用和发展。IPv6 的使用,不仅能解决网络地址资源数量的问题,而且也解决了多种接入设备连入互联网的障碍。

  • IPv 4 报头格式中一些冗余的域或被丢弃或被列为扩展报头,从而降低了包处理和报头带宽的开销。虽然 IPv6 的地址是 IPv4 地址的 4 倍。但报头只有它的 2 倍大。

  • IPv6 的地址长度为 128 位,是 IPv4 地址长度的 4 倍,使 IP 地址在可预见的将来不会用完。于是 IPv4 点分十进制格式不再适用,采用十六进制表示。

  • IPv6 中加入了关于身份验证、数据一致性和保密性的内容。

  • IPv6 协议主要定义了三种地址类型:单播地址(Unicast Address)、组播地址(Multicast Address)和任播地址(Anycast Address)。与原来在 IPv4 地址相比,新增了“任播地址”类型,取消了原来 IPv4 地址中的广播地址,因为在 IPv6 中的广播功能是通过组播来完成的。

  • IPv6 支持无状态自动地址配置,简化了地址配置过程。无需 DNS 服务器也可完成地址的配置,路由广播地址前缀,各主机根据自己 MAC 地址和收到的地址前缀生成可聚合全球单播地址。这也方便了某一区域内的主机同时更换 IP 地址前缀。

IPv6 的三种表示方法

  • 冒分十六进制表示法


格式为 X:X:X:X:X:X:X:X,其中每个 X 表示地址中的 16b,以十六进制表示,例如:


ABCD:EF01:2345:6789:ABCD:EF01:2345:6789


  • 0 位压缩表示法


在某些情况下,一个 IPv6 地址中间可能包含很长的一段 0,可以把连续的一段 0 压缩为“::”。但为保证地址解析的唯一性,地址中”::”只能出现一次。


  • 内嵌 IPv4 地址表示法


为了实现 IPv4-IPv6 互通,IPv4 地址会嵌入 IPv6 地址中,此时地址常表示为:X:X:X:X:X:X:d.d.d.d,前 96b 采用冒分十六进制表示,而最后 32b 地址则使用 IPv4 的点分十进制表示,例如::192.168.0.1 与::FFFF:192.168.0.1 就是两个典型的例子,注意在前 96b 中,压缩 0 位的方法依旧适用。


本文内容到此结束了,

如有收获欢迎点赞👍收藏💖关注✔️,您的鼓励是我最大的动力

如有错误❌疑问💬欢迎各位指出。

主页共饮一杯无的博客汇总👨‍💻

保持热爱,奔赴下一场山海。🏃🏃🏃



发布于: 2022 年 09 月 05 日阅读数: 40
用户头像

鲜衣怒马意气风发,愿你归来仍是少年。 2018.10.19 加入

全栈开发者,CSDN博客专家,51CTO 专家博主,阿里云专家博主,华为云享专家,持续输出干货,欢迎关注。

评论

发布
暂无评论
Java网络编程之InetAddress类详解,URL和URI的区别,URLDecoder和URLEncoder,IPv6和IPv4区别,IPv6的三种表示方法_Java_共饮一杯无_InfoQ写作社区