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 教程。