Flutter WebSockets连接到Socket.io Server

时间:2017-12-29 13:26:12

标签: node.js socket.io flutter

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

正在寻找已经完成此操作并且有一些样本可供查看的人,尝试使用我的应用程序始终连接的聊天服务器,因此如果有更好的服务器架构可供使用,我也会对此开放。任何帮助都会很棒。

提前致谢。

6 个答案:

答案 0 :(得分:2)

我最近还尝试将Flutter应用程序连接到socket.io服务。

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

此致

答案 1 :(得分:2)

问题是您正在尝试使用Flutter的WebSocket实现连接到socket.io服务器。尽管socket.io确实使用WebSockets,但它不是纯Web套接字实现,默认情况下WebSocket客户端不将其识别为有效。您需要使用特定的socket.io flutter软件包。

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

不是什么socket.io

Socket.IO不是WebSocket实现。尽管Socket.IO确实确实在可能的情况下使用WebSocket作为传输工具,但它会向每个数据包添加一些元数据:数据包类型,名称空间和需要消息确认时的确认ID。因此,WebSocket客户端将无法成功连接到Socket.IO服务器,而Socket.IO客户端也将无法连接到WebSocket服务器。

答案 2 :(得分:1)

常规Dart软件包不适用于Flutter,因此我创建了一个软件包,但是目前,它仅适用于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!'},
]);

答案 3 :(得分:1)

adhara_socket_io

dependencies:
adhara_socket_io: ^0.1.11

这是用于扑灭->的socket.io的良好实现

答案 4 :(得分:0)

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

答案 5 :(得分:-1)

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

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服务器。

希望这会有所帮助。不要忘记你需要一个监听器以及传入的消息,我把它作为一个单例并声明一个实例,以便可以从整个应用程序调用它。