javascript - 使用 Node.js 中的 Socket.IO 连接到外部服务器

标签 javascript node.js socket.io iot

背景:我有一个在本地主机上运行的 node.js 服务器(称为服务器 A);和在 https://example.net:3000 上运行 node.js 的外部服务器(称为服务器 B)。我无法控制或访问服务器 B(它是我家中 IoT 设备的仪表板站点),但我需要连接到正在使用 socket.io 并发出特定消息。

我可以从一个平面 javascript 文件(客户端)轻松连接到它,但需要它在服务器端运行(最终目标是使它成为我可以通过 HTTP 请求调用的东西); How to connect two node.js servers with websockets? 等示例表明我应该能够使用来自 node.js 的 socket.io-client 和几乎相同的代码来实现相同的结果。但是当我从 node.js 运行代码时,我无法连接到套接字。

下面是在平面 javascript 文件中成功运行的代码。我知道它有效,因为我在控制台中看到“套接字连接”,而且我还可以测试最后发出的套接字。

var myemail = "email@gmail.com";
var device_id = '12345';
// Create SocketIO instance, connect
var socket = io.connect('https://example.net:3000');

socket.on('connect', function(){
    try {
        console.log('socket connect');
        socket.emit('configure', {email:myemail, deviceid:device_id});
    } catch(e) {
        console.log(e);
    }
});
socket.emit("/" + device_id, "45678");

...以下是从我的 node.js 实例运行时无法运行的代码。我希望命令行日志中出现“socket connect”消息,但什么也得不到。

var express=require('express');
var http=require('http');
var app=express();
var server = http.createServer(app);
//Variables

var myemail = "email@gmail.com";
var device_id = '12345'; 

var io = require('socket.io-client');
var socket = io.connect('https://example.net:3000');

//Connect listener
socket.on('connect', function(){
   try {
      console.log('socket connect');
      socket.emit('configure', {email:myemail, deviceid:device_id});
   } catch(e) {
     console.log(e);
   }
});
socket.emit("/" + device_id, "45678");

有什么想法吗?

更新

运行调试实用程序,结果包含在下面的链接图像中。我看到的关键是 engine.io 尝试进行 xhr 轮询,并从服务器返回 503 响应。 (显然,服务器再次出现真正的“临时错误”,这一切都可以通过在 chrome 中运行客户端 js 来实现)。

debugging output image link

最佳答案

解决了这个 - 问题是我连接到的服务器需要使用 https,所以我需要添加

{secure: true,    rejectUnauthorized: false}

在要连接的 url 之后。

完整的工作示例:

const myemail   = email@email.com;
const device_id   = 12345;
io = require('socket.io-client');
var socket = io.connect('https://server.net:3000',{secure: true,    rejectUnauthorized: false});

function doStuff(){


//Listener
socket.on('connect', function(){
   try {
      console.log('socket connect');
      socket.emit('configure', {email:myemail, deviceid:device_id});

   } catch(e) {
     console.log(e);
   }
});

socket.emit("/" + device_id, "003021");


}


doStuff();

关于javascript - 使用 Node.js 中的 Socket.IO 连接到外部服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45777998/

相关文章:

node.js - io() 函数前端 - socket.io

javascript - 谷歌分析和视觉网站优化器 : Critical Issues in Tag Assistant

javascript - 类型 IntrinsicAttributes 和字符串 [] 上不存在属性 'props'

javascript - 如何判断nodejs child_process是否因超时而失败?

node.js - 尝试运行 "brew uninstall node"

javascript - 为什么我一直面对摩卡 "timeout error"; Node 还一直告诉我兑现我的 promise ?

javascript - 使用 Jquery timeago 插件

node.js - Neo4j 的 Node 模块

javascript - 聊天应用程序无法在端口 80 上运行 socket.io 和 node.js./express

android - android 中的 Socket.io 和 node.js 示例