Flutter WebSocket通信插件shelf_web_socket的使用
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
更多关于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_channel
或dart: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)
接下来,在服务器端使用shelf
和shelf_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进行通信。如果你有其他问题或需要进一步的帮助,请随时提问。