搜索插件、代码仓与 APP 分类

插件详情v0.2.1

web_socket_client

一个简单的 Dart WebSocket 客户端,包含自动重连逻辑。

AndroidiOSWebmacOSWindowsLinux
近 30 天下载
8.9万
喜欢数
216
Pub 分数
160

安装插件

flutter pub add web_socket_client

插件介绍

基于插件公开信息、社区数据与项目使用情况整理的选型参考。

一个轻量级的 Dart WebSocket 客户端,可实现客户端与服务器之间的实时通信。它具有内置的自动重连逻辑,即使在网络中断时也能确保连接稳定。设计简洁可靠,支持所有主要平台,包括 Android、iOS、Web、macOS、Windows 和 Linux。适用于需要持久双向数据流的应用程序,如聊天应用、实时更新或协作工具。

适合场景

  • 实时聊天应用
  • 实时数据流
  • 协作编辑工具
  • 物联网设备通信
  • 通知系统

主要特点

  • 自动重连
  • 跨平台支持
  • 简单 API
  • 内置错误处理
  • 轻便高效

适合对象

  • 开发实时功能的开发者
  • 需要持久连接的应用程序
  • 跨多个平台的项目
  • 优先考虑连接稳定性的团队

使用建议

  • 需要兼容的 WebSocket 服务器
  • 特定用例可能需要自定义重试逻辑
  • 仅限 WebSocket 协议
  • 不适合非实时通信

原始 README

以下为关联源码仓库的 README 原文快照,最新内容请访问源码仓库。

WebSocket Client

build coverage pub package style: very good analysis License: MIT

A simple WebSocket client for Dart which includes automatic reconnection logic.

Quick Start 🚀

// Create a WebSocket client.
final socket = WebSocket(Uri.parse('ws://localhost:8080'));

// Listen to messages from the server.
socket.messages.listen((message) {
  // Handle incoming messages.
});

// Send a message to the server.
socket.send('ping');

// Close the connection.
socket.close();

Establishing a Connection 🔌

The WebSocket client will attempt to establish a connection immediately upon initialization. By default, a timeout will occur if establishing a connection exceeds 60 seconds but a custom timeout duration can be provided:

final uri = Uri.parse('ws://localhost:8080');

// Trigger a timeout if establishing a connection exceeds 10s.
final timeout = Duration(seconds: 10);
final socket = WebSocket(uri, timeout: timeout);

Reconnecting 🔄

If the WebSocket client is not able to establish a connection, it will automatically attempt to reconnect using the provided Backoff strategy. By default, a BinaryExponentialBackoff is used but a custom backoff can be provided.

There are three built-in backoff strategies but a custom backoff strategy can be written by implementing the Backoff interface.

ConstantBackoff

This backoff strategy will make the WebSocket client wait a constant amount of time between reconnection attempts.

// Wait a constant 1s between reconnection attempts.
// [1, 1, 1, ...]
const backoff = ConstantBackoff(Duration(seconds: 1));
final socket = WebSocket(uri, backoff: backoff);

LinearBackoff

This backoff strategy will make the WebSocket client wait a linearly increasing amount of time until an optional maximum duration is reached.

// Initially wait 0s and increase the wait time by 1s until a maximum of 5s is reached.
// [0, 1, 2, 3, 4, 5, 5, 5, ...]
const backoff = LinearBackoff(
  initial: Duration(seconds: 0),
  increment: Duration(seconds: 1),
  maximum: Duration(seconds: 5),
);
final socket = WebSocket(uri, backoff: backoff);

BinaryExponentialBackoff

This backoff strategy will make the WebSocket client wait an exponentially increasing amount of time until a maximum step is reached.

// Initially wait 1s and double the wait time until a maximum step of of 3 is reached.
// [1, 2, 4, 4, 4, ...]
const backoff = BinaryExponentialBackoff(
  initial: Duration(seconds: 1),
  maximumStep: 3
);
final socket = WebSocket(uri, backoff: backoff);

Monitoring the Connection ⚡️

The WebSocket client exposes a connection object which can be used to query the connection state at any given time as well as listen to real-time changes in the connection state.

final uri = Uri.parse('ws://localhost:8080');
final socket = WebSocket(uri);

// Listen to changes in the connection state.
socket.connection.listen((state) {
  // Handle changes in the connection state.
});

// Query the current connection state.
final connectionState = socket.connection.state;

The connection state can be one of the following:

  • connecting: the connection has not yet been established.
  • connected: the connection is established and communication is possible.
  • reconnecting: the connection was lost and is in the process of being re-established.
  • reconnected: the connection was lost and has been re-established.
  • disconnecting: the connection is going through the closing handshake or the close method has been invoked.
  • disconnected: the WebSocket connection has been closed or could not be established.

* The disconnected connection state contains nullable fields for the close code, close reason, error, and stack trace.

Sending Messages 📤

Once a WebSocket connection has been established, messages can be sent to the server via send:

final socket = WebSocket(Uri.parse('ws://localhost:8080'));

// Wait until a connection has been established.
await socket.connection.firstWhere((state) => state is Connected);

// Send a message to the server.
socket.send('ping');

Receiving Messages 📥

Listen for incoming messages from the server via the messages stream:

final socket = WebSocket(Uri.parse('ws://localhost:8080'));

// Listen for incoming messages.
socket.messages.listen((message) {
  // Handle the incoming message.
});

Protobuf 💬

If you're using web_socket_client on the web with Protobuf, you might want to use binaryType when initializing the WebSocket class. binaryType is only applicable on the web and is not used on desktop or mobile platforms.

final socket = WebSocket(Uri.parse('ws://localhost:8080'), binaryType: 'arraybuffer');

See https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/binaryType for more info.

Closing the Connection 🚫

Once a WebSocket connection is established, it will automatically attempt to reconnect if the connection is disrupted. Calling close() will update the connection state to disconnecting, perform the closing handshake, and set the state to disconnected. At this point, the WebSocket client will not attempt to reconnect and a new WebSocket client instance will need to be created in order to establish a new connection.

final socket = WebSocket(Uri.parse('ws://localhost:8080'));

// Later, close the connection with an optional code and reason.
socket.close(1000, 'CLOSE_NORMAL');

所属分类

依赖

依赖清单 3 项

源码仓库

使用此插件的项目

所在榜单