ZetCode

Dart ConnectionTask

最后修改于 2025 年 4 月 4 日

Dart 中的 ConnectionTask 类表示异步网络连接操作。它与套接字连接一起使用,并提供对进行中的连接尝试的控制。

ConnectionTask 允许取消待处理的连接并提供状态信息。它是 Dart dart:io 库中用于网络操作的一部分。

基本定义

ConnectionTask 是套接字连接方法返回的类似 Future 的对象。它代表一个可以被监视或取消的待处理连接尝试。

主要功能包括取消能力、连接超时处理和状态跟踪。它对于健壮的网络应用程序至关重要。

基本的 ConnectionTask 用法

此示例展示了使用 ConnectionTask 的基本连接建立。

main.dart
import 'dart:io';

Future<void> main() async {
  var task = Socket.connect('example.com', 80);
  
  try {
    var socket = await task;
    print('Connected to ${socket.remoteAddress}');
    socket.destroy();
  } catch (e) {
    print('Connection failed: $e');
  }
}

我们尝试连接到 example.com 的 80 端口。connect 方法返回一个 ConnectionTask,我们等待它以获取已连接的套接字。

$ dart main.dart
Connected to InternetAddress('93.184.216.34', IPv4)

取消连接

此示例演示了取消进行中的连接尝试。

main.dart
import 'dart:io';

Future<void> main() async {
  var task = Socket.connect('slow.server', 80);
  
  // Cancel after 2 seconds
  Future.delayed(Duration(seconds: 2), () {
    task.cancel();
    print('Connection canceled');
  });
  
  try {
    var socket = await task;
    print('Connected to ${socket.remoteAddress}');
    socket.destroy();
  } catch (e) {
    print('Connection failed: $e');
  }
}

我们连接到一个慢速服务器,并在 2 秒后取消它。如果连接尝试仍在进行中,cancel() 方法会中止该尝试。

$ dart main.dart
Connection canceled
Connection failed: SocketException: Connection attempt cancelled

连接超时

此示例展示了使用 ConnectionTask 实现连接超时。

main.dart
import 'dart:io';

Future<void> main() async {
  var task = Socket.connect('nonexistent.server', 80)
    .timeout(Duration(seconds: 3));
  
  try {
    var socket = await task;
    print('Connected to ${socket.remoteAddress}');
    socket.destroy();
  } catch (e) {
    print('Connection failed: $e');
  }
}

我们尝试连接到一个不存在的服务器,设置 3 秒的超时。timeout() 方法会创建一个新的 Future,如果连接花费的时间过长,该 Future 将以错误完成。

$ dart main.dart
Connection failed: TimeoutException after 0:00:03.000000: Future not completed

多个连接尝试

此示例演示了管理多个连接尝试。

main.dart
import 'dart:io';

Future<void> main() async {
  var servers = ['server1', 'server2', 'server3'];
  var port = 80;
  
  for (var server in servers) {
    var task = Socket.connect(server, port);
    print('Connecting to $server...');
    
    try {
      var socket = await task.timeout(Duration(seconds: 2));
      print('Connected to $server');
      socket.destroy();
      return;
    } catch (e) {
      print('Failed to connect to $server: $e');
    }
  }
  
  print('All connection attempts failed');
}

我们尝试按顺序连接到多个服务器。第一个成功的连接会停止其他尝试。每次尝试都有 2 秒的超时。

$ dart main.dart
Connecting to server1...
Failed to connect to server1: TimeoutException
Connecting to server2...
Connected to server2

监控连接进度

此示例展示了如何监控连接进度和状态。

main.dart
import 'dart:io';

Future<void> main() async {
  var task = Socket.connect('example.com', 80);
  
  // Add status listener
  task.asStream().listen((event) {
    print('Connection status: $event');
  }, onDone: () {
    print('Connection attempt completed');
  });
  
  try {
    var socket = await task;
    print('Connected successfully');
    socket.destroy();
  } catch (e) {
    print('Connection failed: $e');
  }
}

我们将 ConnectionTask 转换为流以监控状态事件。这使得连接过程的各个阶段都能被看见。

$ dart main.dart
Connection status: Socket.startConnect
Connection status: Socket.connected
Connected successfully
Connection attempt completed

最佳实践

来源

Dart ConnectionTask 文档

本教程通过实际示例涵盖了 Dart 的 ConnectionTask 类,展示了连接管理、取消、超时和监控。

作者

我的名字是 Jan Bodnar,我是一名热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。至今,我已撰写了 1,400 多篇文章和 8 本电子书。我在教授编程方面拥有超过十年的经验。

列出 所有 Dart 教程