我使用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');
正在寻找已经完成此操作并且有一些样本可供查看的人,尝试使用我的应用程序始终连接的聊天服务器,因此如果有更好的服务器架构可供使用,我也会对此开放。任何帮助都会很棒。
提前致谢。
答案 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)
答案 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!"]);
在实施库之前,请始终参考最新版本。 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服务器。
希望这会有所帮助。不要忘记你需要一个监听器以及传入的消息,我把它作为一个单例并声明一个实例,以便可以从整个应用程序调用它。