Flutter中的socket io无法连接到Node.js的socket io服务器

6

我正在尝试使用一个node.js匹配服务器构建一个简单的Flutter聊天应用程序。我已经花了几个小时的时间来处理这个问题,但是我无法让应用程序与服务器连接。

以下是Node.js服务器:

var express=require('express');
var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);

var allClients = {};

io.on('connection', function (socket) {
    io.to(socket.id).emit('userCount', Object.keys(allClients).length);
    console.log(socket.id,'joined');
    //match making logic
});

var port = 8080;
console.log(port);
server.listen(port);

Flutter连接代码:

//Find a match for the user
void findMatch() async {
    SocketIO socketIO = SocketIOManager().createSocketIO("http://192.168.0.32:8080", "/");
    print('Created');
    await socketIO.init(); //code execution pauses indefinitely at this line
    print('Initialized');
    await socketIO.connect();
    print('Connected');

    socketIO.sendMessage('new user', data);

    socketIO.subscribe('match found', (data) async {
      UserData peerData = await getUserData(data.peerId);
      redirectToPage(context, Chat(peerId: data.peerId, peerData: peerData));
    });
}

当函数运行时,代码执行会停在上面显示的那一行,而node.js服务器则没有任何反应。不过这会在调试控制台上显示出来。
D/FlutterSocketIoPlugin: FlutterSocketIoPlugin( 4490): onMethodCall: socketInit - domain: http://192.168.0.32:8080 - with namespace: /
D/FlutterSocketIoPlugin: TOTAL SOCKETS: ( 4490): 0                                                                 
D/FlutterSocketIoPlugin: TOTAL SOCKETS: ( 4490): 0                                                                 
D/FlutterSocketIoPlugin: added SocketIO( 4490): http://192.168.0.32:8080/                                          
D/FlutterSocketIoPlugin: SocketIO( 4490): connecting...null                                                        

非常感谢您的帮助。谢谢!

根据评论中的建议,我编写了一个简单的Node.js客户端,并成功连接到服务器。

//client.js
var io = require('socket.io-client');
var socket = io.connect('http://localhost:8080', {reconnect: true});

// Add a connect listener
socket.on('connect', function (socket) {
    console.log('Connected!');
});
socket.emit('CH01', 'me', 'test msg');

编辑:

在findMatch()函数中将socket函数前的'await'移除后,我得到了以下结果。

D/FlutterSocketIoPlugin: SocketIO(21368): reconnect_error: [{"cause":{"cause":{"detailMessage":"CLEARTEXT communication to 192.168.0.32 not permitted by network security policy","stackTrace":[],"suppressedExceptions":[]},"detailMessage":"websocket error","stackTrace":[],"suppressedExceptions":[]},"detailMessage":"Connection error","stackTrace":[],"suppressedExceptions":[]}]

我在AndroidManifest.xml中尝试使用android:usesCleartextTraffic="true",但似乎没有生效。将http改成https会出现SSL握手中止的情况。也许将套接字服务器部署在具有SSL证书的远程机器上会起作用?继续探究。


你能否尝试用 try...catch 包装这行代码? - Augustin R
你是指执行暂停的那一行吗? - Cracin
是的,有可能存在未捕获的错误。 - Augustin R
1
这是一个愚蠢的问题。你已经使用不同的客户端测试了你的API,并且它按照预期工作了吗? - J. S.
我还没有做到那一步...但是上面的代码就是我写的全部。我会尽快发布一些东西。 - Cracin
显示剩余6条评论
4个回答

13

将我的服务器的socket.io版本降级对我有用。就像上面一样,如果你正在使用nodejs,请尝试卸载socket.io并安装旧版本,如下所示:

npm uninstall socket.io
npm install socket.io@2.3.0

大多数Flutter Socket IO客户端包与socket.io版本2.3.0兼容。如果您遇到类似问题,我建议您降级到此版本。


谢谢你,你救了我! - Andrija

12

我尝试使用这个Flutter插件在这里,因为我想你也在使用同样的插件,但是我也遇到了相同的问题。我试图查看Logcat生成的任何错误日志,并发现了一个条目connecting...null。它停在那里,但不知道如何修复或问题出在哪里。我使用另一个Flutter插件在这里,并在模拟器中测试了下面的示例代码,它可以正常工作。如果您可以使用其他Flutter插件,则可能会有所帮助。

var express = require('express');
var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);

io.on('connection', function (socket) {
    console.log(socket.id, 'joined');
    socket.on('/test', function (msg) {
        console.log(msg);
    });
});

var port = 8080;
console.log(port);
server.listen(port);

Flutter客户端代码 -

IO.Socket socket = IO.io('http://10.0.2.2:8080', <String, dynamic>{
   'transports': ['websocket'],
   'autoConnect': false,
});
socket.connect();
socket.emit('/test', 'test');

感谢@Hitesh Gupta。我花了两天时间检查所有可能的问题,但现在当我更改插件时,它完美地工作了。 - gourav sarswa

1

工作也太辛苦了

服务器(nodejs) => "socket.io": "^2.4.1"

客户端(flutter) => socket_io_client: ^1.0.1


服务器(Node.js)上的“socket.io”版本是“2.4.0”? - vij

1
尝试降级服务器的socket io版本。一些socket io客户端包(如flutter)与最新的服务器端socket io(node.js)不兼容。我的服务器配置使用的是版本3.0.4。出于某种原因,它与adhara_socket_io: 0.4.2socket_io_client: 0.9.12不兼容。通过降级我的node.js socket io版本,两个客户端库都能正常工作。
npm uninstall socket.io
npm install socket.io@2.3.0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接