Dart WebSocket
最后修改于 2025 年 4 月 4 日
Dart 中的 WebSocket 类通过单个 TCP 连接提供全双工通信通道。它支持客户端和服务器之间的实时数据交换。
WebSocket 非常适合需要持久连接的应用,例如聊天应用、实时更新和多人游戏。它是 Dart 的 dart:io 和 dart:html 库的一部分。
基本定义
WebSocket 是一种协议,可在单个 TCP 连接上提供全双工通信。它在客户端和服务器之间建立持久连接。
主要功能包括事件驱动通信、低延迟和高效数据帧。所有现代浏览器和许多服务器平台都支持它。
基本 WebSocket 客户端
本示例展示了如何在 Dart 中创建简单的 WebSocket 客户端。
import 'dart:io';
void main() async {
try {
var socket = await WebSocket.connect('ws://echo.websocket.org');
print('Connected to WebSocket server');
socket.add('Hello from Dart!');
socket.listen((message) {
print('Received: $message');
socket.close();
});
} catch (e) {
print('Error: $e');
}
}
我们连接到一个公共 WebSocket 回显服务器,发送一条消息,并监听响应。在收到回显响应后,连接将关闭。
$ dart main.dart Connected to WebSocket server Received: Hello from Dart!
带错误处理的 WebSocket
本示例演示了带错误处理的健壮 WebSocket 用法。
import 'dart:io';
void main() async {
WebSocket socket;
try {
socket = await WebSocket.connect('ws://echo.websocket.org')
..listen(
(data) => print('Message: $data'),
onError: (err) => print('Error: $err'),
onDone: () => print('Connection closed'),
);
socket.add('Ping');
await Future.delayed(Duration(seconds: 1));
socket.add('Ping 2');
await Future.delayed(Duration(seconds: 1));
await socket.close();
} catch (e) {
print('Connection error: $e');
socket?.close();
}
}
我们建立了一个具有全面错误处理的连接。该示例展示了多次消息交换和正确的连接清理。
$ dart main.dart Message: Ping Message: Ping 2 Connection closed
WebSocket 服务器
本示例演示了如何在 Dart 中创建简单的 WebSocket 服务器。
import 'dart:io';
void main() async {
final server = await HttpServer.bind('localhost', 8080);
print('WebSocket server listening on ws://:8080');
await for (var request in server) {
if (WebSocketTransformer.isUpgradeRequest(request)) {
var socket = await WebSocketTransformer.upgrade(request);
handleConnection(socket);
} else {
request.response.statusCode = HttpStatus.forbidden;
request.response.close();
}
}
}
void handleConnection(WebSocket socket) {
print('Client connected: ${socket.hashCode}');
socket.listen(
(message) {
print('Received: $message');
socket.add('Echo: $message');
},
onError: (error) => print('Error: $error'),
onDone: () => print('Client disconnected'),
);
}
我们创建了一个 WebSocket 服务器,它将接收到的消息回显给客户端。服务器处理多个并发连接并正确管理错误。
$ dart server.dart WebSocket server listening on ws://:8080 Client connected: 123456 Received: Hello Client disconnected
二进制数据传输
本示例展示了如何通过 WebSocket 发送和接收二进制数据。
import 'dart:io';
import 'dart:typed_data';
void main() async {
var socket = await WebSocket.connect('ws://:8080');
// Send binary data
var data = Uint8List.fromList([1, 2, 3, 4, 5]);
socket.add(data);
// Handle binary responses
socket.listen((message) {
if (message is Uint8List) {
print('Received binary: ${message.toList()}');
} else {
print('Received text: $message');
}
socket.close();
});
}
我们演示了如何将二进制数据作为 Uint8List 发送以及如何处理不同类型的消息。WebSocket 同时支持文本和二进制数据传输。
$ dart main.dart Received binary: [1, 2, 3, 4, 5]
带 JSON 的 WebSocket
本示例展示了使用 JSON 进行结构化数据通信的 WebSocket。
import 'dart:io';
import 'dart:convert';
void main() async {
var socket = await WebSocket.connect('ws://:8080');
// Send JSON data
var message = {'type': 'greeting', 'content': 'Hello Server'};
socket.add(jsonEncode(message));
// Handle JSON responses
socket.listen((data) {
try {
var response = jsonDecode(data);
print('Received JSON: ${response['type']} - ${response['content']}');
} catch (e) {
print('Error parsing JSON: $e');
}
socket.close();
});
}
我们使用 JSON 进行客户端和服务器之间的结构化通信。该示例展示了复杂数据结构的编码和解码。
$ dart main.dart Received JSON: response - Hello Client
最佳实践
- 错误处理:始终实现全面的错误处理
- 连接管理:完成后正确关闭连接
- Ping/Pong:为长期连接实现心跳保持
- 消息格式:标准化消息格式(JSON、Protobuf)
- 背压:通过适当的缓冲来处理消息泛滥
来源
本教程涵盖了 Dart 的 WebSocket 类,并通过实际示例展示了客户端和服务器实现、二进制数据传输和 JSON 消息传递。
作者
列出 所有 Dart 教程。