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

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

我可以很容易地从一个平面的JavaScript文件(客户端)连接到它,但需要它运行服务器端(最终的目标是使它成为我可以调用一个HTTP请求); 以及如何使用websockets连接两个node.js服务器的示例? build议我应该能够使用几乎相同的代码从node.js使用socket.io客户端来实现相同的结果。 但是当我从node.js运行代码时,我无法连接到套接字。

以下是在平面JavaScript文件中成功运行的代码。 我知道这是可行的,因为我看到控制台中的“套接字连接”,我也可以testing在最后发出的套接字。

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实例运行时无法工作的代码。 我期望在命令行日志中有一个消息'套接字连接',并且什么都不收。

 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"); 

有任何想法吗?

UPDATE

运行debugging实用程序,结果包含在下面的链接图像。 我所看到的关键是engine.io尝试进行xhr轮询,并从服务器获取503响应。 (显然,服务器不是真正的“临时错误”,这一切都是从运行客户端js的铬)。

debugging输出图像链接

我认为导致这个问题的路线是:

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

我设法使用这个代码做一个工作的例子:

 const myemail = "email@gmail.com"; const device_id = '12345'; var socket = require('socket.io-client')('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); } }); 

解决了这个问题 – 我连接的服务器需要使用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();