Dart InternetAddress
最后修改于 2025 年 4 月 4 日
Dart 中的 InternetAddress
类表示一个 IP 地址(IPv4 或 IPv6),并提供地址操作和解析的实用程序。
它是 Dart 的 dart:io
库的一部分,对于网络编程至关重要,包括套接字操作和主机名解析。
基本定义
InternetAddress
封装了一个 IP 地址,并提供用于解析、验证和查找地址的方法。它同时支持 IPv4 和 IPv6。
主要功能包括地址验证、主机名解析以及字符串表示和原始字节格式之间的转换。
创建 InternetAddress 对象
本示例展示了如何从字符串创建基本的 InternetAddress 对象。
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 地址。
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 地址的原始字节表示。
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 对象的各种属性。
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 记录)。
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
最佳实践
- 验证:始终验证用户输入的 IP 地址
- 异步:对主机名查找和反向查找使用 await
- 错误处理:处理网络操作的 SocketException
- IPv6:同时使用 IPv4 和 IPv6 地址进行测试
- 缓存:在可能的情况下缓存已解析的地址
来源
本教程介绍了 Dart 的 InternetAddress 类,并通过实际示例展示了地址创建、DNS 解析、反向查找和属性检查。
作者
列出 所有 Dart 教程。