【问题标题】:Flutter socket io doesn't connect to node js socket io serverFlutter socket io没有连接到节点js socket io服务器
【发布时间】:2020-04-28 07:06:06
【问题描述】:

我正在尝试使用 node.js 匹配服务器构建一个简单的颤振聊天应用程序。我已经使用了几个小时,但我无法让应用程序连接到服务器。

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

感谢任何帮助。谢谢!

我按照cmets的建议写了一个简单的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":[]}]

我在AndroidManifest.xml 中尝试了android:usesCleartextTraffic="true",但它似乎不起作用。将 http 更改为 https 会得到 SSL handshake aborted。也许使用 SSL 证书在远程机器上部署套接字服务器会起作用?将继续挖掘。

【问题讨论】:

  • 你能试着用try...catch 换行吗?
  • 你指的是执行暂停的那一行吗?
  • 是的。可能存在未捕获的错误
  • @AugustinR 不,没有发现错误
  • 愚蠢的问题。您已经使用不同的客户端测试了您的 API,并且它按预期工作?

标签: node.js flutter socket.io


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢你,你救了我!
【解决方案2】:

我用这个颤振插件here 尝试了上面的代码,因为我认为你也在使用相同的,但我也遇到了同样的问题。我试图查看Logcat 生成的任何错误日志,我发现了一个条目connecting...null,它被卡在那里但不知道如何修复或问题是什么。我用另一个颤振插件here 进行了尝试,并在模拟器中对其进行了测试,它适用于以下示例代码。如果您可以使用不同的颤振插件,那么这可能会很有用。

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。我花了 2 天时间检查所有可能的问题。但是现在当我更改插件时,它可以完美运行。
【解决方案3】:

尝试降级服务器的套接字 io 版本。一些 socket io 客户端包(flutter)与最新的服务器端 socket io(node.js)不兼容。我的服务器配置使用的是 3.0.4 版本。由于某种原因,它与adhara_socket_io: 0.4.2socket_io_client: 0.9.12 不兼容。通过降级我的 node.js 套接字 io 版本适用于两个客户端库

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

【讨论】:

    【解决方案4】:

    也可以工作

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

    client(flutter) => socket_io_client: ^1.0.1

    【讨论】:

    • server(nodejs) "socket.io": "2.4.0" 怎么样?
    猜你喜欢
    • 1970-01-01
    • 2018-11-13
    • 2022-09-27
    • 1970-01-01
    • 1970-01-01
    • 2019-04-10
    • 2019-05-09
    • 1970-01-01
    • 2012-12-16
    相关资源
    最近更新 更多