Dart Socket
最后修改于 2025 年 4 月 4 日
Dart 中的 Socket 类提供了 TCP 网络通信功能。它是 dart:io 库的一部分,支持客户端和服务器网络操作。
Sockets 支持端点之间的双向通信。它们可以通过 TCP/IP 网络传输原始字节或文本数据,并支持各种事件。
基本定义
Socket 表示两个端点之间的 TCP 网络连接。它提供流来异步地读写数据。
主要功能包括事件驱动的数据处理、连接管理以及对 IPv4 和 IPv6 地址的支持。Sockets 与 Streams 一起工作。
基础 Socket 客户端
此示例展示了一个连接到服务器的简单 TCP 客户端。
main.dart
import 'dart:io';
void main() async {
try {
var socket = await Socket.connect('localhost', 8080);
print('Connected to server');
socket.write('Hello from Dart client');
socket.destroy();
} catch (e) {
print('Error: $e');
}
}
我们创建一个到 localhost 8080 端口的套接字连接。发送消息后,我们关闭连接。错误处理捕获连接问题。
$ dart main.dart Connected to server
带数据监听的 Socket
此示例演示了从套接字连接读取数据。
main.dart
import 'dart:io';
import 'dart:convert';
void main() async {
var socket = await Socket.connect('example.com', 80);
socket.write('GET / HTTP/1.1\r\nHost: example.com\r\n\r\n');
socket.listen(
(List<int> data) {
print(utf8.decode(data));
},
onDone: () {
print('Connection closed');
socket.destroy();
}
);
}
我们连接到一个 Web 服务器并发送一个 HTTP 请求。listen 回调处理传入的数据。完成后连接会自动关闭。
$ dart main.dart HTTP/1.1 200 OK Content-Type: text/html; charset=UTF-8 ... Connection closed
Socket 服务器
此示例创建了一个简单的 TCP 服务器,用于接受客户端连接。
main.dart
import 'dart:io';
void main() async {
var server = await ServerSocket.bind('127.0.0.1', 8080);
print('Server listening on ${server.address}:${server.port}');
server.listen((Socket socket) {
socket.write('Hello from server!\n');
socket.close();
});
}
服务器绑定到 localhost 的 8080 端口。对于每个客户端连接,它会发送一个问候语然后关闭。ServerSocket 管理多个客户端。
$ dart main.dart Server listening on 127.0.0.1:8080
双向通信
此示例展示了类似聊天的双向套接字通信。
main.dart
import 'dart:io';
import 'dart:async';
void main() async {
var socket = await Socket.connect('localhost', 8080);
socket.listen(
(data) => print('Server: ${String.fromCharCodes(data)}'),
onDone: () => socket.destroy()
);
var input = stdin.transform(utf8.decoder);
await for (var message in input) {
socket.write(message);
}
}
客户端连接到服务器并监听消息。它还从控制台读取用户输入并将其发送到服务器。UTF-8 处理文本。
$ dart main.dart Hello Server: Hi there! How are you? Server: I'm fine, thanks!
带超时的 Socket
此示例演示了带超时处理的套接字连接。
main.dart
import 'dart:io';
void main() async {
try {
var socket = await Socket.connect('localhost', 8080)
.timeout(Duration(seconds: 5));
socket.write('Quick message');
await socket.flush();
socket.destroy();
print('Message sent successfully');
} on SocketException catch (e) {
print('Socket error: $e');
} on TimeoutException {
print('Connection timed out');
}
}
如果连接不成功,连接尝试将在 5 秒后超时。我们分别处理套接字错误和超时异常。
$ dart main.dart Connection timed out
最佳实践
- 错误处理: 始终处理 SocketException 和其他错误
- 资源清理: 完成后调用 destroy() 或 close()
- 缓冲: 对重要的写入操作使用 flush()
- 编码: 在需要时指定文本编码
- 超时: 为操作设置合理的超时时间
来源
本教程介绍了 Dart 的 Socket 类,并提供了实际示例,展示了客户端/服务器通信、数据处理和错误管理。
作者
列出 所有 Dart 教程。