Flutter套接字IO无法连接到Node JS套接字IO服务器

时间:2020-01-10 15:51:36

标签: node.js flutter socket.io

我正在尝试使用node.js对接服务器构建一个简单的flutter聊天应用程序。我已经使用了几个小时,但是我无法使应用程序与服务器连接。

这是节点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);

颤振连接代码:

//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));
    });
}

运行该函数时,代码执行在上面显示的行处暂停,并且节点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()中的套接字函数之前的'await's。

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":[]}]

我在android:usesCleartextTraffic="true"中尝试过AndroidManifest.xml,但似乎不起作用。将http更改为https将得到SSL handshake aborted。也许将套接字服务器部署在具有SSL证书的远程计算机上可以工作吗?将继续挖掘。

4 个答案:

答案 0 :(得分:9)

Downgrading 我的服务器的 socket.io version 为我工作。同上,如果您使用的是 nodejs,请尝试卸载 socket.io 并安装旧版本,如下所示:

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

大多数 flutter socket io 客户端包都与 socket.io version 2.3.0 兼容。如果您遇到类似问题,我建议您降级到此。

答案 1 :(得分:4)

我使用此flutter插件here尝试了上面的代码,因为我认为您也使用了相同的插件,但是我也遇到了同样的问题。我试图查看Logcat生成的任何错误日志,但发现了一个条目connecting...null,它被卡在了那里,但是不知道如何解决或出了什么问题。我在另一个flutter插件here上进行了尝试,并在模拟器中对其进行了测试,在下面的示例代码中它可以正常工作。如果您可以使用其他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');

答案 2 :(得分:0)

D/FlutterSocketIoPlugin: FlutterSocketIoPlugin(22067): onMethodCall: socketSubcribes 
D/FlutterSocketIoPlugin: FlutterSocketIoPlugin(22067): socketData: {"messageEvent":"FunctionId@202086814"}
D/FlutterSocketIoPlugin: TOTAL SOCKETS: (22067): 3
D/FlutterSocketIoPlugin: SocketIO(22067): --- subscribes ---{"messageEvent":"FunctionId@202086814"}
D/FlutterSocketIoPlugin: subscribe(22067): channel: messageEvent - with callback: FunctionId@202086814
D/FlutterSocketIoPlugin: socketInfo(22067): SUBSCRIBES SIZES: NULL or EMPTY
D/FlutterSocketIoPlugin: socketInfo(22067): SUBSCRIBES SIZES: 1
D/FlutterSocketIoPlugin: socketInfo(22067): CHANNEL: messageEvent with TOTAL LISTENERS: 1

答案 3 :(得分:0)

也工作

server(nodejs) => "socket.io": "^2.4.1"

client(flutter) => socket_io_client:^1.0.1