我使用 Dart 和 Flutter 客户端应用程序制作了一个简单的 WebSocket 服务器。运行客户端应用程序时,服务器出于某种原因将连接注册为多个请求。我搜索了一段时间,但无法弄清楚这是为什么。这可能是什么原因造成的?
服务器代码:
import 'dart:io' show HttpServer, HttpRequest, WebSocket, WebSocketTransformer;
void main() {
var sockets = <WebSocket>[];
var i = 0;
HttpServer.bind('localhost', 8080).then((server) {
print('[+]WebSocket listening at -- ws://localhost:8080/');
server.listen((HttpRequest request) {
print('request made');
WebSocketTransformer.upgrade(request).then((WebSocket ws) {
sockets.add(ws);
print('added a socket to the list');
ws.listen(
(data) {
print(data);
for(var socket in sockets) {
socket.add('a msg back from the server: $i');
print('msg sent to the client');
}
i++;
},
onDone: () => print('[+]Done :)'),
onError: (err) => print('[!]Error -- ${err.toString()}'),
cancelOnError: true
);
}, onError: (err) => print('[!]Error -- ${err.toString()}'));
}, onError: (err) => print('[!]Error -- ${err.toString()}'));
}, onError: (err) => print('[!]Error -- ${err.toString()}'));
}
客户端代码:
import 'package:flutter/material.dart';
import 'package:web_socket_channel/web_socket_channel.dart';
class ChangingText extends StatefulWidget {
final _channel = WebSocketChannel.connect(
Uri.parse('ws://localhost:8080/')
);
@override
_ChangingTextState createState() => _ChangingTextState();
}
class _ChangingTextState extends State<ChangingText> {
String _text = '';
WebSocketChannel _channel = WebSocketChannel.connect(
Uri.parse('ws://localhost:8080/')
);
_ChangingTextState() {
_text = 'press me';
_channel.stream.listen((data){
setState(() {_text = data;});
print(data);
});
}
@override
Widget build(BuildContext context) {
return Column(children: [
ElevatedButton(
child: Text(_text),
onPressed: (){widget._channel.sink.add("msg from the flutter client!");},
),
]);
}
}
class App extends StatelessWidget {
const App({ Key? key }) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(home: Scaffold(body:
ChangingText()
));
}
}
void main() {
runApp(App());
}
在此先感谢您的帮助!