Flutter WebSocket通信插件shelf_web_socket的使用

发布于 1周前 作者 sinazl 来自 Flutter

Flutter WebSocket通信插件shelf_web_socket的使用

Web Socket Handler for Shelf

shelf_web_socket 是一个用于通过 Shelf 建立 WebSocket 连接的处理器。它暴露了一个单一函数 webSocketHandler,该函数为每一个建立的连接调用 onConnection 回调,并提供一个 WebSocketChannel 对象。

示例代码

下面是一个完整的示例,演示了如何使用 shelf_web_socket 创建一个简单的 WebSocket 服务器,该服务器会将收到的消息回显给客户端:

import 'package:shelf/shelf_io.dart' as shelf_io;
import 'package:shelf_web_socket/shelf_web_socket.dart';
import 'package:web_socket_channel/web_socket_channel.dart';

void main() {
  // 创建 WebSocket 处理器
  var handler = webSocketHandler((WebSocketChannel webSocket) {
    // 监听来自客户端的消息
    webSocket.stream.listen((message) {
      print('Received message: $message');
      // 将消息回显给客户端
      webSocket.sink.add("Echo: $message");
    }, onError: (error) {
      print('Error occurred: $error');
      webSocket.sink.close();
    }, onDone: () {
      print('Client has disconnected.');
    });
  });

  // 启动服务器并监听指定地址和端口
  shelf_io.serve(handler, 'localhost', 8080).then((server) {
    print('Serving at ws://${server.address.host}:${server.port}');
  }).catchError((e) {
    print('Failed to serve: $e');
  });
}

添加依赖

在您的 pubspec.yaml 文件中添加以下依赖项以确保您能够使用上述代码:

dependencies:
  shelf: ^1.0.0
  shelf_web_socket: ^1.0.1
  web_socket_channel: ^2.0.0

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

客户端测试

为了测试上面的 WebSocket 服务器,您可以使用任何支持 WebSocket 的客户端工具或库。例如,在浏览器控制台中使用 JavaScript 测试:

const socket = new WebSocket('ws://localhost:8080');

socket.onopen = () => {
  console.log('Connected to server');
  socket.send('Hello, Server!');
};

socket.onmessage = (event) => {
  console.log('Message from server:', event.data);
};

socket.onerror = (error) => {
  console.error('WebSocket error:', error);
};

socket.onclose = () => {
  console.log('Server connection closed');
};

这个简单的例子展示了如何设置一个基本的 WebSocket 服务器与客户端进行通信。根据实际需求,您可以扩展此基础框架来构建更复杂的应用程序功能。


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

1 回复

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


当然,以下是如何在Flutter应用中使用shelf_web_socket插件进行WebSocket通信的示例代码。不过,需要注意的是,shelf_web_socket实际上是一个Dart库,用于在服务器端处理WebSocket连接,而不是直接在Flutter客户端使用的插件。Flutter客户端通常使用如web_socket_channeldart:io(在支持Dart VM的平台上)进行WebSocket通信。

不过,为了回答你的问题,我将展示如何在Flutter客户端使用web_socket_channel插件进行WebSocket通信,以及如何在服务器端使用shelf_web_socket处理连接。

Flutter 客户端代码

首先,在你的Flutter项目中添加web_socket_channel依赖:

dependencies:
  flutter:
    sdk: flutter
  web_socket_channel: ^2.1.0  # 确保使用最新版本

然后,在你的Flutter代码中创建WebSocket连接并发送/接收消息:

import 'package:flutter/material.dart';
import 'package:web_socket_channel/web_socket_channel.dart';
import 'dart:async';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: WebSocketPage(),
    );
  }
}

class WebSocketPage extends StatefulWidget {
  @override
  _WebSocketPageState createState() => _WebSocketPageState();
}

class _WebSocketPageState extends State<WebSocketPage> {
  WebSocketChannel? _channel;
  TextEditingController _controller = TextEditingController();
  List<String> _messages = [];

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

  void connectToWebSocket() async {
    _channel = WebSocketChannel.connect(Uri.parse('ws://localhost:8080'));

    _channel!.stream.listen(
      (message) {
        setState(() {
          _messages.add('Received: $message');
        });
      },
      onError: (error) {
        setState(() {
          _messages.add('Error: $error');
        });
      },
      onDone: () {
        setState(() {
          _messages.add('Connection closed');
        });
      },
    );
  }

  void sendMessage() {
    if (_channel != null && !_controller.text.isEmpty) {
      _channel!.sink.add(_controller.text);
      setState(() {
        _messages.add('Sent: ${_controller.text}');
        _controller.clear();
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('WebSocket Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            Expanded(
              child: ListView.builder(
                itemCount: _messages.length,
                itemBuilder: (context, index) {
                  return Text(_messages[index]);
                },
              ),
            ),
            TextField(
              controller: _controller,
              decoration: InputDecoration(border: OutlineInputBorder()),
              onEditingComplete: sendMessage,
              onSubmitted: (value) {
                sendMessage();
              },
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: sendMessage,
        tooltip: 'Send message',
        child: Icon(Icons.send),
      ),
    );
  }
}

Dart 服务器端代码(使用 shelf_web_socket)

接下来,在服务器端使用shelfshelf_web_socket来处理WebSocket连接:

首先,添加依赖到你的pubspec.yaml文件中:

dependencies:
  shelf: ^1.0.0
  shelf_web_socket: ^1.0.0

然后,创建一个Dart文件(例如server.dart)来处理WebSocket连接:

import 'package:shelf/shelf.dart';
import 'package:shelf_router/shelf_router.dart';
import 'package:shelf_web_socket/shelf_web_socket.dart';
import 'dart:convert';

void main() {
  var handler = Router()
    .get('/', (Request request) async {
      return Response.ok('Hello, World!');
    })
    .ws('/ws', (WebSocket webSocket) async {
      webSocket.onMessage.listen((message) async {
        print('Received: ${utf8.decode(message)}');
        await webSocket.send(utf8.encode('Echo: ${utf8.decode(message)}'));
      });

      webSocket.onClose.listen((int? code, String? reason) {
        print('WebSocket closed with code $code and reason $reason');
      });
    });

  var server = Shelf.serve(handler, 'localhost', 8080);
  print('Serving at ws://localhost:8080/ws');
}

运行服务器后,Flutter客户端应该能够连接到WebSocket服务器,并发送和接收消息。

希望这能帮助你理解如何在Flutter客户端和Dart服务器端使用WebSocket进行通信。如果你有其他问题或需要进一步的帮助,请随时提问。

回到顶部