0

我使用 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());
}

在此先感谢您的帮助!

4

1 回答 1

0

把前面的评论放在这里结束这个问题:

看起来你连接了两次。在ChangingText小部件和_ChangingTextState

于 2022-01-16T20:09:50.947 回答