Flutter WebSocket通信插件better_web_socket的使用

Flutter WebSocket通信插件better_web_socket的使用

安装启动

步骤1

pubspec.yaml文件中添加以下依赖:

dependencies:
  better_web_socket: ^1.0.1

步骤2

执行安装命令:

$ flutter packages get

常规使用

以下是使用better_web_socket的基本示例:

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

// 接收数据
void receiveData(BuildContext context) {
  MyWebSocketController controller = context.read<MyWebSocketController>();

  receiveDataSubscription?.cancel();
  receiveDataSubscription = controller.receiveDataStream.listen((data) {
    int clientRequestId = parse(data).clientRequestId; // 从服务器获取的 clientRequestId
    controller.handleSendDataResponse(clientRequestId, BetterWebSocketSendDataResponseState.SUCCESS);
  });

  sendDataResponseStateSubscription?.cancel();
  sendDataResponseStateSubscription = controller.sendDataResponseStateStream.listen((data) {
    int clientRequestId = data.item1;
    if (clientRequestIdList.contains(clientRequestId)) {
      clientRequestIdList.remove(clientRequestId);

      String result = "";
      switch (data.item2) {
        case BetterWebSocketSendDataResponseState.SUCCESS:
          result = "发送数据成功";
          break;
        case BetterWebSocketSendDataResponseState.FAIL:
          result = "发送数据失败";
          break;
        case BetterWebSocketSendDataResponseState.TIMEOUT:
          result = "发送数据超时";
          break;
      }
      print(result);
    }
  });
}

// 连接
void connect(BuildContext context) {
  context.read<DeviceWebSocketController>().startWebSocketConnect(retryCount: double.maxFinite.toInt());
}

// 断开连接
void disconnect(BuildContext context, Duration duration) {
  context.read<DeviceWebSocketController>().stopWebSocketConnectAfter(duration: duration);
}

// 发送数据
void sendData() {
  context.read<DeviceWebSocketController>().sendDataAndWaitResponse(clientRequestId, data, retryCount: 3);
}

功能特性

  • ✅ 自动重连
  • ✅ 延迟断开连接
  • ✅ 模拟HTTP请求
  • ✅ 当socket连接时自动登录

示例代码

以下是完整的示例代码,展示了如何使用better_web_socket插件。

import 'package:better_web_socket/better_web_socket.dart';
import 'package:better_web_socket_example/constant.dart';
import 'package:better_web_socket_example/normal_page.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return ChangeNotifierProvider(
      create: (_) => BetterWebSocketController(serverUrl),
      child: MaterialApp(
        home: MainPage(),
      ),
    );
  }
}

class MainPage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('better web socket 示例应用'),
      ),
      body: Center(
        child: Container(
          child: CupertinoButton(
            child: Text("WebSocket 测试"),
            onPressed: () {
              Navigator.of(context).push(CupertinoPageRoute(
                builder: (context) {
                  return NormalPage();
                },
              ));
            },
          ),
        ),
      ),
    );
  }
}

更多关于Flutter WebSocket通信插件better_web_socket的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter WebSocket通信插件better_web_socket的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter应用中使用better_web_socket插件进行WebSocket通信的示例代码。这个示例展示了如何建立WebSocket连接、发送消息、接收消息以及处理连接状态变化。

首先,确保你已经在pubspec.yaml文件中添加了better_web_socket依赖:

dependencies:
  flutter:
    sdk: flutter
  better_web_socket: ^x.y.z  # 请替换为最新版本号

然后运行flutter pub get来安装依赖。

接下来是示例代码:

import 'package:flutter/material.dart';
import 'package:better_web_socket/better_web_socket.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'WebSocket Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: WebSocketDemo(),
    );
  }
}

class WebSocketDemo extends StatefulWidget {
  @override
  _WebSocketDemoState createState() => _WebSocketDemoState();
}

class _WebSocketDemoState extends State<WebSocketDemo> {
  BetterWebSocket? _socket;
  TextEditingController _messageController = TextEditingController();
  List<String> _messages = [];

  @override
  void initState() {
    super.initState();
    initWebSocket();
  }

  void initWebSocket() {
    _socket = BetterWebSocket(
      'wss://echo.websocket.org',  // 替换为你的WebSocket服务器URL
      onOpen: (data) {
        print('WebSocket is open now. $data');
        _addMessage('Connected to WebSocket server.');
      },
      onMessage: (data) {
        print('Received message: $data');
        _addMessage('Received: $data');
      },
      onClose: (data) {
        print('WebSocket is closed now. $data');
        _addMessage('Disconnected from WebSocket server.');
      },
      onError: (data) {
        print('WebSocket error: $data');
        _addMessage('Error: $data');
      },
    );

    // 自动重连配置(可选)
    _socket!.autoReconnect = true;
    _socket!.reconnectInterval = Duration(seconds: 5);
    _socket!.maxReconnectAttempts = 5;
  }

  void _sendMessage() {
    if (_socket!.readyState == WebSocketReadyState.OPEN) {
      String message = _messageController.text;
      _socket!.send(message);
      _addMessage('Sent: $message');
      _messageController.clear();
    } else {
      _addMessage('WebSocket is not open.');
    }
  }

  void _addMessage(String message) {
    setState(() {
      _messages.add(message);
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('WebSocket Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: Column(
          children: <Widget>[
            Expanded(
              child: ListView.builder(
                itemCount: _messages.length,
                itemBuilder: (context, index) {
                  return Text(_messages[index]);
                },
              ),
            ),
            TextField(
              controller: _messageController,
              decoration: InputDecoration(
                border: OutlineInputBorder(),
                labelText: 'Enter message',
              ),
              onSubmitted: _sendMessage,
            ),
            ElevatedButton(
              onPressed: _sendMessage,
              child: Text('Send'),
            ),
          ],
        ),
      ),
    );
  }

  @override
  void dispose() {
    _socket?.close();
    _messageController.dispose();
    super.dispose();
  }
}

代码说明:

  1. 依赖导入

    • 导入flutterbetter_web_socket包。
  2. 应用入口

    • 使用MaterialApp创建应用入口,设置主页面为WebSocketDemo
  3. WebSocket页面

    • WebSocketDemo是一个有状态的组件,用于管理WebSocket连接和消息显示。
    • initState方法中初始化WebSocket连接,并设置连接打开、收到消息、连接关闭和发生错误时的回调函数。
    • autoReconnectreconnectIntervalmaxReconnectAttempts用于配置自动重连(可选)。
  4. 消息发送

    • _sendMessage方法用于发送消息到WebSocket服务器,并在UI上更新已发送的消息。
  5. 消息显示

    • 使用ListView.builder动态显示接收到的消息。
  6. UI布局

    • 使用TextFieldElevatedButton创建消息输入和发送按钮。
  7. 资源释放

    • dispose方法中关闭WebSocket连接并释放资源。

希望这个示例能帮助你理解如何在Flutter应用中使用better_web_socket插件进行WebSocket通信。如果有任何进一步的问题,请随时询问!

回到顶部