ZetCode

Dart InternetAddressType

最后修改于 2025 年 4 月 4 日

Dart 中的 InternetAddressType 类是一个枚举,用于表示不同类型的 IP 地址。它与 InternetAddress 类一起使用,用于指定地址族。

此枚举对于 Dart 中的网络编程至关重要,有助于区分 IPv4 和 IPv6 地址。它是 Dart 的 dart:io 库的一部分,用于服务器端应用程序。

基本定义

InternetAddressType 是一个枚举,具有两个值:IPv4IPv6。它们代表网络中使用的两个主要 IP 地址版本。

该类型有助于确定地址格式、解析和网络操作。在 Dart 中创建或检查网络连接时经常使用它。

检查地址类型

此示例显示了如何检查 InternetAddress 的类型。

main.dart
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

创建特定地址类型

此示例演示了如何创建具有特定类型的地址。

main.dart
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

查找地址类型

此示例演示了在主机名查找期间检查地址类型。

main.dart
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
---

按地址类型过滤

此示例演示了如何按类型过滤地址。

main.dart
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

具有特定类型的服务器套接字

此示例演示了如何创建具有特定地址类型的服务器套接字。

main.dart
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

最佳实践

来源

Dart InternetAddressType 文档

本教程涵盖了 Dart 的 InternetAddressType 类,并通过实际示例演示了类型检查、地址创建、DNS 查找和服务器套接字。

作者

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

列出 所有 Dart 教程