ZetCode

Dart WebSocket

最后修改于 2025 年 4 月 4 日

Dart 中的 WebSocket 类通过单个 TCP 连接提供全双工通信通道。它支持客户端和服务器之间的实时数据交换。

WebSocket 非常适合需要持久连接的应用,例如聊天应用、实时更新和多人游戏。它是 Dart 的 dart:iodart:html 库的一部分。

基本定义

WebSocket 是一种协议,可在单个 TCP 连接上提供全双工通信。它在客户端和服务器之间建立持久连接。

主要功能包括事件驱动通信、低延迟和高效数据帧。所有现代浏览器和许多服务器平台都支持它。

基本 WebSocket 客户端

本示例展示了如何在 Dart 中创建简单的 WebSocket 客户端。

main.dart
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 用法。

main.dart
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 服务器。

server.dart
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 发送和接收二进制数据。

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

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

最佳实践

来源

Dart WebSocket 文档

本教程涵盖了 Dart 的 WebSocket 类,并通过实际示例展示了客户端和服务器实现、二进制数据传输和 JSON 消息传递。

作者

我叫 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在教授编程方面拥有十多年的经验。

列出 所有 Dart 教程