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

简介: 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的存在。
image.png

  • 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位的方法依旧适用。

相关文章:
Java网络编程入门(软件结构、网络通信协议、网络编程三要素)
Java网络编程之通过代码实现Socket通信)
Java网络编程之实现文件上传

相关文章
|
4月前
|
Java 测试技术
Java浮点类型详解:使用与区别
Java中的浮点类型主要包括float和double,它们在内存占用、精度范围和使用场景上有显著差异。float占用4字节,提供约6-7位有效数字;double占用8字节,提供约15-16位有效数字。float适合内存敏感或精度要求不高的场景,而double精度更高,是Java默认的浮点类型,推荐在大多数情况下使用。两者都存在精度限制,不能用于需要精确计算的金融领域。比较浮点数时应使用误差范围或BigDecimal类。科学计算和工程计算通常使用double,而金融计算应使用BigDecimal。
1723 102
|
2月前
|
Java
Java语言实现字母大小写转换的方法
Java提供了多种灵活的方法来处理字符串中的字母大小写转换。根据具体需求,可以选择适合的方法来实现。在大多数情况下,使用 String类或 Character类的方法已经足够。但是,在需要更复杂的逻辑或处理非常规字符集时,可以通过字符流或手动遍历字符串来实现更精细的控制。
229 18
|
2月前
|
Java 编译器 Go
【Java】(5)方法的概念、方法的调用、方法重载、构造方法的创建
Java方法是语句的集合,它们在一起执行一个功能。方法是解决一类问题的步骤的有序组合方法包含于类或对象中方法在程序中被创建,在其他地方被引用方法的优点使程序变得更简短而清晰。有利于程序维护。可以提高程序开发的效率。提高了代码的重用性。方法的名字的第一个单词应以小写字母作为开头,后面的单词则用大写字母开头写,不使用连接符。例如:addPerson。这种就属于驼峰写法下划线可能出现在 JUnit 测试方法名称中用以分隔名称的逻辑组件。
201 4
|
3月前
|
算法 安全 Java
除了类,Java中的接口和方法也可以使用泛型吗?
除了类,Java中的接口和方法也可以使用泛型吗?
141 11
|
2月前
|
编解码 Java 开发者
Java String类的关键方法总结
以上总结了Java `String` 类最常见和重要功能性方法。每种操作都对应着日常编程任务,并且理解每种操作如何影响及处理 `Strings` 对于任何使用 Java 的开发者来说都至关重要。
282 5
|
3月前
|
Java 开发者
Java 函数式编程全解析:静态方法引用、实例方法引用、特定类型方法引用与构造器引用实战教程
本文介绍Java 8函数式编程中的四种方法引用:静态、实例、特定类型及构造器引用,通过简洁示例演示其用法,帮助开发者提升代码可读性与简洁性。
|
4月前
|
算法 Java 开发者
Java 项目实战数字华容道与石头迷阵游戏开发详解及实战方法
本文介绍了使用Java实现数字华容道和石头迷阵游戏的技术方案与应用实例,涵盖GUI界面设计、二维数组操作、游戏逻辑控制及自动解法算法(如A*),适合Java开发者学习游戏开发技巧。
287 46
|
3月前
|
安全 Java API
Java SE 与 Java EE 区别解析及应用场景对比
在Java编程世界中,Java SE(Java Standard Edition)和Java EE(Java Enterprise Edition)是两个重要的平台版本,它们各自有着独特的定位和应用场景。理解它们之间的差异,对于开发者选择合适的技术栈进行项目开发至关重要。
407 1
|
5月前
|
Java Apache 开发者
解决java.lang.IllegalArgumentException: Invalid uri由无效查询引起的问题
最后,当你修改代码以避免这个异常时,保持代码的整洁和可读性同样重要。注释你的代码,用意图清晰的方法名,并确保逻辑简单明了,这样在未来你或其他开发者需要时可以轻松地维护它。
571 20
|
4月前
|
算法 Java
Java语言实现链表反转的方法
这种反转方法不需要使用额外的存储空间,因此空间复杂度为,它只需要遍历一次链表,所以时间复杂度为,其中为链表的长度。这使得这种反转链表的方法既高效又实用。
385 0