【问题标题】:Why does my socket.io app disconnect immediately when run on Raspberry pi?为什么我的 socket.io 应用在树莓派上运行时会立即断开连接?
【发布时间】:2017-10-07 04:12:51
【问题描述】:

我正在尝试在可以与远程 socket.io 服务器通信的 Raspberry Pi 上构建 node.js 应用程序。

socket.io 服务器在建立新连接和关闭现有连接时非常简单地写入控制台。

socket.io 客户端在浏览器中运行时按预期工作。

但是,当我从 Raspberry Pi 运行客户端代码时,它会连接并立即终止。这不允许我执行任何功能,例如发射或接收。

on connect 事件永远不会被触发。

var io = require('/usr/local/lib/node_modules/socket.io-client');
var serverUrl = 'http://remoteserver.com';

console.log('Connecting to ' + serverUrl);
var socket = io.connect(serverUrl);

socket.on('connect', function(socket) {
    console.log('Connection established!');
    console.log(socket.id);

    socket.on('disconnect', function() {
            console.log('Disconnected from server');
    });

});

上面的代码会输出:

Connecting to: http://remoteserver.com

在服务器端,输出将显示一个新连接,并最终超时关闭。

为什么客户端连接事件没有触发?如何保持此连接,以便最终将输入发送到服务器?

【问题讨论】:

  • 因为您正在立即关闭连接。
  • 你应该添加一些错误处理:github.com/socketio/socket.io-client/blob/master/docs/… 服务器是否实现了某种身份验证(基于会话 cookie 或其他东西)?
  • 确保您没有在代理或攻击性应用程序防火墙后面进行连接,因为这可能会导致您所描述的问题。初始连接将成功,但其余的套接字流量将永远无法返回,您的客户端最终将超时并关闭。
  • 在节点端尝试“connection”事件而不是“connect”

标签: javascript node.js sockets raspberry-pi


【解决方案1】:

删除线:

socket.close();

来自您的代码。您正在立即关闭套接字。请记住,所有事件处理程序都是异步的。它们是非阻塞的,将来会被调用。同时,您的其余代码运行完成,因此您的 socket.close() 在您的客户端有机会获得任何事件(断开连接事件除外)之前执行。

如果你想做一些事情然后关闭套接字,那么你只需要从一些事件处理程序中关闭套接字,它表明你的操作已经完成并且你现在已经完成了套接字。

【讨论】:

  • 很抱歉给您带来了困惑。如果没有 socket.close() 行,也会出现相同的结果。连接只是挂起,没有调用任何事件。我尝试了其他事件名称,但也没有调用。
  • @aaronfarr - 你需要做一些调试。您显示的客户端代码没有其他明显错误。我建议您为事件connect_errorconnect_timeouterror 安装事件处理程序,看看是否触发了这些事件。此外,socket.on('connect', function(socket) { 应该是 socket.on('connect', function() {,没有 socket 参数。对于客户端代码,您已经拥有socket
【解决方案2】:

当你想关闭树莓派的连接时,你只需要调用 socket.close()。另外,socket.io-client 文档没有使用 .connect 方法,而是调用require('socket.io-client')(serverUrl)

var io = require('/usr/local/lib/node_modules/socket.io-client');
var serverUrl = 'http://remoteserver.com';

console.log('Connecting to ' + serverUrl);
var socket = io(serverUrl);

socket.on('connect', function(socket) {
    console.log('Connection established!');
    console.log(socket.id);
});

socket.on('disconnect', function() {
    console.log('Disconnected from server');
});

//Removed the socket.close() line

【讨论】:

  • 很抱歉给您带来了困惑。如果没有 socket.close() 行,也会出现相同的结果。你的例子会说“连接到remoteserver.com”然后挂起。它永远不会到达“连接”事件内部。我添加了 socket.close() 行以查看是否至少可以在服务器端触发断开连接事件(它没有)。所以这里肯定发生了其他事情。
  • 更新答案。
猜你喜欢
  • 2020-07-14
  • 2017-05-08
  • 1970-01-01
  • 1970-01-01
  • 2021-11-19
  • 1970-01-01
  • 2015-06-21
  • 1970-01-01
  • 2019-05-17
相关资源
最近更新 更多