ZetCode

Dart WebSocketStatus

最后修改于 2025 年 4 月 4 日

Dart 中的 WebSocketStatus 类提供了 WebSocket 连接状态的常量。它用于检查 WebSocket 连接的当前状态。

WebSocketStatus 包含表示不同连接阶段的静态整数值。这些值有助于管理 WebSocket 的生命周期事件和错误处理。

基本定义

WebSocketStatus 是一个包含 WebSocket 连接状态静态常量的类。它是 Dart 的 dart:io 库的一部分。

关键状态码包括连接中、已打开、正在关闭和已关闭的状态。还有异常关闭和协议错误的码。

检查连接状态

此示例展示了如何检查基本的 WebSocket 连接状态。

main.dart
import 'dart:io';

void main() async {
  var socket = await WebSocket.connect('ws://echo.websocket.org');
  
  if (socket.readyState == WebSocketStatus.open) {
    print('Connection is open');
  } else if (socket.readyState == WebSocketStatus.connecting) {
    print('Still connecting');
  }
  
  await socket.close();
}

我们连接到 WebSocket 服务器,并将其 readyState 与 WebSocketStatus 常量进行比较。已打开状态表示连接成功。

$ dart main.dart
Connection is open

处理连接错误

此示例演示了如何检查异常关闭状态。

main.dart
import 'dart:io';

void main() async {
  try {
    var socket = await WebSocket.connect('ws://invalid.url');
  } on WebSocketException catch (e) {
    print('Connection failed: ${e.message}');
    
    if (e.inner?.readyState == WebSocketStatus.abnormalClosure) {
      print('Abnormal closure detected');
    }
  }
}

我们尝试连接到无效的 URL 并捕获 WebSocketException。内部套接字的 readyState 显示了异常关闭的状态。

$ dart main.dart
Connection failed: Connection failed
Abnormal closure detected

监控状态变更

此示例展示了如何跟踪 WebSocket 状态的转换。

main.dart
import 'dart:io';

void main() async {
  var socket = await WebSocket.connect('ws://echo.websocket.org');
  print('Initial state: ${socket.readyState}');
  
  socket.listen(
    (data) => print('Data received'),
    onDone: () {
      print('Final state: ${socket.readyState}');
      if (socket.readyState == WebSocketStatus.closed) {
        print('Connection closed normally');
      }
    }
  );
  
  await socket.close();
}

我们监控 WebSocket 从打开到关闭的状态变化。onDone 回调在连接关闭后检查最终状态。

$ dart main.dart
Initial state: 1
Final state: 3
Connection closed normally

协议错误处理

此示例演示了如何检查协议错误。

main.dart
import 'dart:io';

void main() async {
  try {
    var socket = await WebSocket.connect('ws://echo.websocket.org');
    
    // Force protocol violation
    socket.add('Invalid binary data');
    await socket.close();
  } on WebSocketException catch (e) {
    if (e.inner?.readyState == WebSocketStatus.protocolError) {
      print('Protocol error occurred');
    }
  }
}

我们通过发送无效数据故意导致协议违规。异常处理程序会检查 protocolError 状态码。

$ dart main.dart
Protocol error occurred

连接生命周期跟踪

此示例展示了如何跟踪所有可能的 WebSocket 状态。

main.dart
import 'dart:io';

void printState(int state) {
  switch (state) {
    case WebSocketStatus.connecting:
      print('Connecting');
      break;
    case WebSocketStatus.open:
      print('Open');
      break;
    case WebSocketStatus.closing:
      print('Closing');
      break;
    case WebSocketStatus.closed:
      print('Closed');
      break;
    default:
      print('Unknown state');
  }
}

void main() async {
  var socket = await WebSocket.connect('ws://echo.websocket.org');
  printState(socket.readyState);
  
  socket.add('Hello');
  await socket.close();
  printState(socket.readyState);
}

我们创建了一个辅助函数,用于将状态码转换为人类可读的字符串。这显示了从连接到关闭的完整连接生命周期。

$ dart main.dart
Open
Closed

最佳实践

来源

Dart WebSocketStatus 文档

本教程涵盖了 Dart 的 WebSocketStatus 类,并通过实际示例展示了 WebSocket 的连接监控、错误处理和状态管理。

作者

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

列出 所有 Dart 教程