【问题标题】:Flutter WebSockets connect to Socket.io ServerFlutter WebSockets 连接到 Socket.io 服务器
【发布时间】:2017-12-29 13:26:11
【问题描述】:

我已经使用 Node.js 和 Express 构建了一个 socket.io 服务器。在浏览器和普通 socket.io 客户端上一切正常,但是当我尝试在 Flutter 中使用 WebSocket 时出现错误

HttpException: Connection closed before full header was received, uri = http://csw.abbadabba.tech:3001

我只是想让它与这样的基本连接一起工作:

var _url = 'ws://csw.abbadabba.tech:3001';
WebSocket chatsocket = await WebSocket.connect(_url);
chatsocket.add('connect');

寻找已经这样做并且有一些示例可以查看的人,尝试拥有一个我的应用程序始终连接到的聊天服务器,所以如果有更好的服务器架构可以使用,我也愿意.任何帮助都会很棒。

提前致谢。

【问题讨论】:

    标签: node.js socket.io flutter


    【解决方案1】:

    问题是您正在尝试使用 Flutter 的 WebSocket 实现来连接到 socket.io 服务器。尽管 socket.io 确实使用了 WebSockets,但它不是一个纯 Web 套接字实现,并且默认 WebSocket 客户端不会将其识别为有效。您需要使用特定的 socket.io 颤振包。

    来自 socket.io 文档:https://socket.io/docs/#What-Socket-IO-is-not

    socket.io 不是什么

    Socket.IO 不是 WebSocket 实现。尽管 Socket.IO 确实尽可能使用 WebSocket 作为传输,但它为每个数据包添加了一些元数据:数据包类型、命名空间和需要消息确认时的 ack id。这就是为什么 WebSocket 客户端将无法成功连接到 Socket.IO 服务器,而 Socket.IO 客户端也将无法连接到 WebSocket 服务器。

    【讨论】:

      【解决方案2】:

      adhara_socket_io

      dependencies:
      adhara_socket_io: ^0.1.11
      

      这是用于flutter的socket.io很好的实现->

      【讨论】:

        【解决方案3】:

        Flutter 没有官方的 Socket.IO 版本,但是仍然可以通过名为 adhara_socket_io 的最好的 Dart 库之一来实现,它是根据 Socket.IO Java 客户端和 Swift 开发的。它支持Android和iOS。

        实施

        SocketIOManager manager = SocketIOManager();
        
        SocketIO socket = manager.createInstance(SocketOptions(
            'http://192.168.1.12:5555',
            nameSpace: '/yournamespace',
            enableLogging: true,
            transports: [Transports.POLLING]
        ));
        
        socket.onConnect((data) {
          print("onConnected");
          print(data);
        });
        
        socket.on("news", (data) {
          print("onNews");
          print(data);
        });
        
        socket.connect();
        

        发射

        socket.emit("some_event", ["Hello world!"]);
        

        文档:GitHub | Dart

        在实施库之前,请始终参考最新版本。 Releases

        【讨论】:

          【解决方案4】:

          不适合 Flutter 的常规 Dart 包,所以我创建了一个包,但目前它只适用于 Android 设备。看看吧:https://github.com/AlexeySemigradsky/socket_io

          使用示例:

          const uri = 'http://192.168.1.38:8080';
          final socket = await SocketIO.createNewInstance(uri);
          await socket.on(SocketIOEvent.connecting, () async {
            print('Connecting...');
          });
          await socket.on(SocketIOEvent.connect, () async {
            print('Connected.');
          
            final id = await socket.id;
            print('Client SocketID: $id');
          });
          await socket.on(SocketIOEvent.connectError, (error) {
            print('Error: $error');
          });
          await socket.on('sayHello', (greeting) {
            print('Hello, ${greeting['Hello']}');
          });
          await socket.connect();
          await socket.emit('sayHello', [
            {'Hello': 'world!'},
          ]);
          

          【讨论】:

          【解决方案5】:

          我最近还尝试将 Flutter App 连接到 socket.io 服务。

          不幸的是,您不能在不实现 socket.io 协议的情况下简单地使用 WebSocket。因为我不想自己实现这个,所以我试图为 Dart 找到一个 socket.io 库。有一个库 (https://github.com/rikulo/socket.io-dart) 但它不能在颤振中工作,因为它使用 dart html。到目前为止,我还没有找到解决这个问题的好方法。

          问候

          【讨论】:

          • 你可以试试this
          【解决方案6】:

          我发现了如何有效地完成这项工作。我正在使用

          import 'package:web_socket_channel/io.dart';
          

          这提供了连接、sed 和接收消息所需的代码。

          doConnect(url, fullname) async {
              chatsocket = await new IOWebSocketChannel.connect(url, pingInterval: new Duration(seconds: 5));
              ChatServerConnect csc =  new ChatServerConnect('connect', fullname);
              var json = jsonCodec.encode(csc);
              chatsocket.sink.add(json);
              _getPrefs();
              isConnected = true;
              syncMessages();
              chatlisten(chatsocket);
            }
          

          这可以修改为根据需要进行连接,这是特定于我创建的 websocket 服务器的。

          希望这会有所帮助。不要忘记您还需要一个监听器来接收传入消息,我将其作为一个单例并声明了一个实例,以便可以从整个应用程序中调用它。

          【讨论】:

          • 我看不出这段代码在 Flutter+Socket.io 中是如何工作的
          • 有具体问题吗?我没有使用 socket.io
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-29
          • 2013-01-30
          • 1970-01-01
          • 2014-09-12
          相关资源
          最近更新 更多