Dart InternetAddressType
最后修改于 2025 年 4 月 4 日
Dart 中的 InternetAddressType 类是一个枚举,用于表示不同类型的 IP 地址。它与 InternetAddress 类一起使用,用于指定地址族。
此枚举对于 Dart 中的网络编程至关重要,有助于区分 IPv4 和 IPv6 地址。它是 Dart 的 dart:io 库的一部分,用于服务器端应用程序。
基本定义
InternetAddressType 是一个枚举,具有两个值:IPv4 和 IPv6。它们代表网络中使用的两个主要 IP 地址版本。
该类型有助于确定地址格式、解析和网络操作。在 Dart 中创建或检查网络连接时经常使用它。
检查地址类型
此示例显示了如何检查 InternetAddress 的类型。
import 'dart:io';
void main() {
var ipv4 = InternetAddress('192.168.1.1');
var ipv6 = InternetAddress('2001:0db8:85a3::8a2e:0370:7334');
print('IPv4 type: ${ipv4.type}'); // InternetAddressType.IPv4
print('IPv6 type: ${ipv6.type}'); // InternetAddressType.IPv6
if (ipv4.type == InternetAddressType.IPv4) {
print('This is an IPv4 address');
}
}
我们创建 IPv4 和 IPv6 地址,并通过 type 属性检查它们的类型。type 属性返回一个 InternetAddressType 值。
$ dart main.dart IPv4 type: InternetAddressType.IPv4 IPv6 type: InternetAddressType.IPv6 This is an IPv4 address
创建特定地址类型
此示例演示了如何创建具有特定类型的地址。
import 'dart:io';
void main() {
var ipv4 = InternetAddress('127.0.0.1', type: InternetAddressType.IPv4);
var ipv6 = InternetAddress('::1', type: InternetAddressType.IPv6);
try {
// This will throw an exception
var invalid = InternetAddress('192.168.1.1', type: InternetAddressType.IPv6);
} on ArgumentError catch (e) {
print('Error: $e');
}
}
我们在创建地址时显式指定地址类型。如果地址与指定的类型不匹配,则会抛出 ArgumentError。
$ dart main.dart Error: Invalid argument(s): Invalid IPv6 address: 192.168.1.1
查找地址类型
此示例演示了在主机名查找期间检查地址类型。
import 'dart:io';
Future<void> main() async {
var addresses = await InternetAddress.lookup('example.com');
for (var addr in addresses) {
print('Address: ${addr.address}');
print('Type: ${addr.type}');
print('Is IPv6: ${addr.type == InternetAddressType.IPv6}');
print('---');
}
}
我们执行 DNS 查找并检查返回地址的类型。主机名可以解析为 IPv4 和 IPv6 地址。
$ dart main.dart Address: 93.184.216.34 Type: InternetAddressType.IPv4 Is IPv6: false --- Address: 2606:2800:220:1:248:1893:25c8:1946 Type: InternetAddressType.IPv6 Is IPv6: true ---
按地址类型过滤
此示例演示了如何按类型过滤地址。
import 'dart:io';
Future<void> main() async {
var addresses = await InternetAddress.lookup('google.com');
var ipv4Addrs = addresses.where(
(addr) => addr.type == InternetAddressType.IPv4
);
var ipv6Addrs = addresses.where(
(addr) => addr.type == InternetAddressType.IPv6
);
print('IPv4 addresses:');
ipv4Addrs.forEach((addr) => print(addr.address));
print('\nIPv6 addresses:');
ipv6Addrs.forEach((addr) => print(addr.address));
}
我们查找 google.com 的地址,并使用 where 方法按类型将它们分开。当您需要单独处理不同地址类型时,这很有用。
$ dart main.dart IPv4 addresses: 142.250.190.46 IPv6 addresses: 2607:f8b0:4009:80e::200e
具有特定类型的服务器套接字
此示例演示了如何创建具有特定地址类型的服务器套接字。
import 'dart:io';
Future<void> main() async {
var ipv6Loopback = InternetAddress('::1', type: InternetAddressType.IPv6);
var server = await ServerSocket.bind(
ipv6Loopback,
8080,
);
print('Server listening on IPv6: ${server.address.address}');
server.listen((Socket socket) {
socket.write('Hello from IPv6 server!');
socket.close();
});
}
我们创建了一个服务器套接字,该套接字仅在 IPv6 回环地址上监听。InternetAddressType 确保我们使用的是正确的地址版本。
$ dart main.dart Server listening on IPv6: ::1
最佳实践
- 显式类型:创建地址时指定地址类型
- 类型检查:在网络代码中始终验证地址类型
- 双栈:尽可能支持 IPv4 和 IPv6
- 错误处理:优雅地处理类型不匹配
来源
本教程涵盖了 Dart 的 InternetAddressType 类,并通过实际示例演示了类型检查、地址创建、DNS 查找和服务器套接字。
作者
列出 所有 Dart 教程。