ZetCode

Dart InternetAddress

最后修改于 2025 年 4 月 4 日

Dart 中的 InternetAddress 类表示一个 IP 地址(IPv4 或 IPv6),并提供地址操作和解析的实用程序。

它是 Dart 的 dart:io 库的一部分,对于网络编程至关重要,包括套接字操作和主机名解析。

基本定义

InternetAddress 封装了一个 IP 地址,并提供用于解析、验证和查找地址的方法。它同时支持 IPv4 和 IPv6。

主要功能包括地址验证、主机名解析以及字符串表示和原始字节格式之间的转换。

创建 InternetAddress 对象

本示例展示了如何从字符串创建基本的 InternetAddress 对象。

main.dart
import 'dart:io';

void main() async {
  // IPv4 address
  var ipv4 = InternetAddress('192.168.1.1');
  print('IPv4: ${ipv4.address}');
  print('Type: ${ipv4.type}');
  
  // IPv6 address
  var ipv6 = InternetAddress('2001:0db8:85a3::8a2e:0370:7334');
  print('IPv6: ${ipv6.address}');
  print('Type: ${ipv6.type}');
  
  // Loopback address
  var loopback = InternetAddress.loopbackIPv4;
  print('Loopback: ${loopback.address}');
}

我们从 IPv4 和 IPv6 地址的字符串表示形式创建 InternetAddress 对象。type 属性指示地址族(IPv4 或 IPv6)。

$ dart main.dart
IPv4: 192.168.1.1
Type: InternetAddressType.IPv4
IPv6: 2001:0db8:85a3::8a2e:0370:7334
Type: InternetAddressType.IPv6
Loopback: 127.0.0.1

主机名解析

本示例演示了如何查找主机名的 IP 地址。

main.dart
import 'dart:io';

void main() async {
  try {
    var addresses = await InternetAddress.lookup('example.com');
    
    print('Addresses for example.com:');
    for (var addr in addresses) {
      print('${addr.address} (${addr.type})');
    }
  } on SocketException catch (e) {
    print('Failed to lookup address: $e');
  }
}

lookup() 方法异步执行 DNS 解析,返回一个 InternetAddress 对象列表。我们处理潜在的 SocketException 以防错误。

$ dart main.dart
Addresses for example.com:
93.184.216.34 (InternetAddressType.IPv4)
2606:2800:220:1:248:1893:25c8:1946 (InternetAddressType.IPv6)

使用原始地址

本示例展示了如何处理 IP 地址的原始字节表示。

main.dart
import 'dart:io';

void main() {
  // Create from raw bytes (IPv4)
  var rawIpv4 = InternetAddress.fromRawAddress(
    Uint8List.fromList([192, 168, 1, 100])
  );
  print('Raw IPv4: ${rawIpv4.address}');
  
  // Create from raw bytes (IPv6)
  var rawIpv6 = InternetAddress.fromRawAddress(
    Uint8List.fromList([
      0x20, 0x01, 0x0d, 0xb8, 0x85, 0xa3, 0x00, 0x00,
      0x00, 0x00, 0x8a, 0x2e, 0x03, 0x70, 0x73, 0x34
    ]),
    type: InternetAddressType.IPv6
  );
  print('Raw IPv6: ${rawIpv6.address}');
}

我们从原始字节数组创建 InternetAddress 对象。对于 IPv6,我们必须显式指定地址类型。这对于低级网络编程很有用。

$ dart main.dart
Raw IPv4: 192.168.1.100
Raw IPv6: 2001:db8:85a3::8a2e:370:7334

检查地址属性

本示例演示了如何检查 InternetAddress 对象的各种属性。

main.dart
import 'dart:io';

void main() {
  var privateAddr = InternetAddress('10.0.0.1');
  var publicAddr = InternetAddress('8.8.8.8');
  var loopback = InternetAddress.loopbackIPv4;
  var multicast = InternetAddress('224.0.0.1');
  
  print('10.0.0.1 is private: ${privateAddr.isPrivate}');
  print('8.8.8.8 is private: ${publicAddr.isPrivate}');
  print('127.0.0.1 is loopback: ${loopback.isLoopback}');
  print('224.0.0.1 is multicast: ${multicast.isMulticast}');
}

InternetAddress 提供了属性来检查地址是否为私有、回环或多播地址。这些对于网络配置和验证很有用。

$ dart main.dart
10.0.0.1 is private: true
8.8.8.8 is private: false
127.0.0.1 is loopback: true
224.0.0.1 is multicast: true

反向 DNS 查询

本示例展示了如何执行反向 DNS 查询(PTR 记录)。

main.dart
import 'dart:io';

void main() async {
  var addr = InternetAddress('8.8.8.8');
  
  try {
    var host = await addr.reverse();
    print('Reverse lookup for ${addr.address}: ${host.host}');
  } on SocketException catch (e) {
    print('Reverse lookup failed: $e');
  }
}

reverse() 方法执行 PTR 记录查询,以查找与 IP 地址关联的主机名。此操作是异步的,并且可能会失败。

$ dart main.dart
Reverse lookup for 8.8.8.8: dns.google

最佳实践

来源

Dart InternetAddress 文档

本教程介绍了 Dart 的 InternetAddress 类,并通过实际示例展示了地址创建、DNS 解析、反向查找和属性检查。

作者

我叫 Jan Bodnar,是一位充满激情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出 所有 Dart 教程