为什么我的socket.io应用程序在Raspberry pi上运行时会立即断开连接?

时间:2017-05-09 01:59:38

标签: javascript node.js sockets raspberry-pi

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

当建立新连接和关闭现有连接时,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

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

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

2 个答案:

答案 0 :(得分:2)

删除该行:

socket.close();

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

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

答案 1 :(得分:0)

当你想要关闭来自raspberry pi的连接时,你只需要调用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