Я пытаюсь подключить клиентское приложение, локально развернутое к серверному приложению, которое я развернул на heroku, используя socket.io.Приложение прекрасно работает локально, но я не могу установить веб-сокеты при развертывании на heroku.
Код моего сервера:
import { Meteor } from 'meteor/meteor';
import "../imports/api/salaDeVenta.js"
import "../imports/api/dispositivo.js"
import "../imports/api/empresa.js"
import {SalaDeVenta} from "../imports/api/salaDeVenta.js";
import { Dispositivo } from "../imports/api/dispositivo.js";
Meteor.startup(() => {
// @ts-nocheck
var Collections = require('typescript-collections');
var dictScheduling = new Collections.MultiDictionary(); //HAY QUE GUARDAR LOS J ACA
var dict = new Collections.Dictionary();
var socketVar = null
var app = require('http').createServer(handler)
var io = require('socket.io')(app);
var fs = require('fs');
var portToListen = 8080
var server = app.listen({
host: '127.0.0.1',
port: 8080,
}, function(data) {
console.log('------CALLBACKS DATA: ' , data)
var host = server.address().address;
var portp = server.address().port;
console.log('Example app listening at http://%s:%s', host, portp);
});
//SCHEDULING <------------------------
var schedule = require('node-schedule');
var salasDeVenta = SalaDeVenta.find({}).fetch()
//console.log(salasDeVenta)
salasDeVenta.map((salaDeVenta,salaDeVentai)=>{
//console.log(salaDeVenta.name)
//para el schedule de despertar
var dispositivoEnCabeza = Dispositivo.find({ idSalaDeVentas: salaDeVenta._id, dispCabeza: true}).fetch()
dispositivoEnCabeza.map((dispEnCabeza,dispEnCabezai)=>{
//console.log(dispEnCabeza.especificaciones + dispEnCabeza.direccionMAC)
var res = salaDeVenta.turnOnHour.split(":") // PUEDE QUE FALLE AL NO HABER HECHO TRIM DEL 0
var dispositivosPorSalaDeVenta = Dispositivo.find({ idSalaDeVentas: salaDeVenta._id}).fetch()
// console.log(dispositivosPorSalaDeVenta);
var j1 = schedule.scheduleJob({hour: res[0], minute: res[1]}, function(){
// console.log("HASTA")
//EXCUTE WAKE ON LAN PROTOCOL
var dispositivosALevantar = dispositivosPorSalaDeVenta
//console.log("DONDE")
dispositivosPorSalaDeVenta.map((dispActual,dispActuali)=>{
//console.log(dispEnCabeza.especificaciones + dispEnCabeza.direccionMAC)
dict.getValue(dispEnCabeza.direccionMAC).emit('wakePCByMAC',dispActual.direccionMAC)
});
});
j1.disp = dispEnCabeza.especificaciones;
dictScheduling.setValue(salaDeVenta._id,j1)
console.log("wakeonlan scheduled for device with MAC ADDRESS " + dispEnCabeza.direccionMAC + " at "+salaDeVenta.turnOnHour);
});
//para el schedule de apagar
var dispositivosPorSalaDeVenta = Dispositivo.find({ idSalaDeVentas: salaDeVenta._id}).fetch()
dispositivosPorSalaDeVenta.map((dispActual,dispActuali)=>{
var res = salaDeVenta.turnOffHour.split(":") // PUEDE QUE FALLE AL NO HABER HECHO TRIM DEL 0
var j2 = schedule.scheduleJob({hour: res[0], minute: res[1]}, function(){
//EXCUTE SLEEP PROTOCOL
dict.getValue(dispActual.direccionMAC).emit('sleepPCByMAC')
});
j2.disp = dispActual.especificaciones;
dictScheduling.setValue(salaDeVenta._id,j2)
console.log("sleep scheduled for device with MAC ADDRESS " + dispActual.direccionMAC + " at "+salaDeVenta.turnOffHour);
});
});
//-------------TEST-------------------
//No puedee ser 00 el tiempo, tiene que ser 0
//Cuando se corre el servidor por primera vez, la libreria usa la hora del sistema en ESE momento, por lo que cambiar la hora del sistema luego de haber iniciado el servidor no tiene ningun efecto
var j = schedule.scheduleJob({hour: 10, minute: 02}, function(){
console.log("THIS IS IT");
});
//-------------------------------------
//SOCKETS XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
function handler (req, res) {
fs.readFile(__dirname + '/index.html',
function (err, data) {
if (err) {
res.writeHead(500);
return res.end('Error loading index.html');
}
res.writeHead(200);
res.end(data);
});
}
io.on('connection',Meteor.bindEnvironment((socket)=> {
var maciD;
console.log("connection attempt...")
socketVar = socket;
socketVar.emit('IdentifySocket')
socketVar.on('MACIdentification', Meteor.bindEnvironment((MACIdentification) =>{
console.log('The client with MAC address ' + MACIdentification + ' has joined the server' );
dict.setValue(MACIdentification,socketVar);
dict.getValue(MACIdentification).emit('SocketValidationTest')
Meteor.call('dispositivos.updateConnection',MACIdentification,true)
maciD = MACIdentification
}));
socketVar.on('disconnect', Meteor.bindEnvironment(function() {
console.log('The client with MAC address ' + maciD + ' has disconnected')
Meteor.call('dispositivos.updateConnection',maciD,false)
}));
}));
//METHODS
Meteor.methods({
foo: function () {
return 1;
},
bar: function () {
// QUESTION: HOW TO CALL Meteor.methods.foo
return 1 + foo;
},
'socket.sendWakeMessageToMAC':function(pconMac){
var res = pconMac.split("-")
console.log("DIR MAC CABEZA "+ res[0])
console.log("DIR MAC TO "+ res[1])
dict.getValue(res[0]).emit('wakePCByMAC',res[1])
//socketVar.emit('wakePCByMAC', DirecconMAC);
},
'socket.sendSleepMessageToMAC':function(DirecconMAC){
dict.getValue(DirecconMAC).emit('sleepPCByMAC')
//socketVar.emit('sleepPCByMAC', DirecconMAC);
},
'schedule.updateEncendidoYApagadoBySalaDeVentas':function(idSalaDeVentas){
console.log("-------RESCHEDULING-----------------");
dictScheduling.getValue(idSalaDeVentas).forEach(cancelSchedules);
function cancelSchedules(item, index) {
console.log(item.disp + "cancelled")
item.cancel();
}
dictScheduling.remove(idSalaDeVentas)
var salasDeVenta = SalaDeVenta.find({_id: idSalaDeVentas}).fetch()
salasDeVenta.map((salaDeVenta,salaDeVentai)=>{
//para el schedule de despertar
var dispositivoEnCabeza = Dispositivo.find({ idSalaDeVentas: salaDeVenta._id, dispCabeza: true}).fetch()
dispositivoEnCabeza.map((dispEnCabeza,dispEnCabezai)=>{
var res = salaDeVenta.turnOnHour.split(":") // PUEDE QUE FALLE AL NO HABER HECHO TRIM DEL 0
var dispositivosPorSalaDeVenta = Dispositivo.find({ idSalaDeVentas: salaDeVenta._id}).fetch()
var j1 = schedule.scheduleJob({hour: res[0], minute: res[1]}, function(){
//EXCUTE WAKE ON LAN PROTOCOL
var dispositivosALevantar = dispositivosPorSalaDeVenta
dispositivosPorSalaDeVenta.map((dispActual,dispActuali)=>{
dict.getValue(dispEnCabeza.direccionMAC).emit('wakePCByMAC',dispActual.direccionMAC)
});
});
j1.disp = dispEnCabeza.especificaciones;
dictScheduling.setValue(salaDeVenta._id,j1)
console.log("wakeonlan scheduled for device with MAC ADDRESS " + dispEnCabeza.direccionMAC + " at "+salaDeVenta.turnOnHour);
});
//para el schedule de apagar
var dispositivosPorSalaDeVenta = Dispositivo.find({ idSalaDeVentas: salaDeVenta._id}).fetch()
dispositivosPorSalaDeVenta.map((dispActual,dispActuali)=>{
var res = salaDeVenta.turnOffHour.split(":") // PUEDE QUE FALLE AL NO HABER HECHO TRIM DEL 0
var j2 = schedule.scheduleJob({hour: res[0], minute: res[1]}, function(){
//EXCUTE SLEEP PROTOCOL
dict.getValue(dispActual.direccionMAC).emit('sleepPCByMAC')
});
j2.disp = dispActual.especificaciones;
dictScheduling.setValue(salaDeVenta._id,j2)
console.log("sleep scheduled for device with MAC ADDRESS " + dispActual.direccionMAC + " at "+salaDeVenta.turnOffHour);
});
});
console.log("-------ReschedulingOVER-----------------");
},
});
});
Код моего клиента:
import { Meteor } from 'meteor/meteor';
import io from 'socket.io-client';
Meteor.startup(() => {
// code to run on server at startup
//WAKE UP PC BY MAC When message is received through socket
const socket = io('http://hwmonitool.herokuapp.com/');
console.log("relaunch")
socket.on('wakePCByMAC', function (MacAddressReceived) {
console.log(MacAddressReceived);
const wol = require('wakeonlan')
// MAC is case-insensitive. colons optional
wol(MacAddressReceived).then(() => {
console.log('wol sent!')
})
},
//SLEEPS PC when message is received rhoeough PC
);
socket.on('sleepPCByMAC', function () {
var cmd=require('node-cmd');
cmd.run('rundll32.exe powrprof.dll,SetSuspendState 0,1,0');
},
);
//IDENTIFIES the computer
socket.on('IdentifySocket', function () {
var macaddress = require('macaddress');
macaddress.one('Ethernet', function (err, mac) {
console.log("Mac address for Ethernet: %s", mac);
socket.emit('MACIdentification', mac)
});
},
);
//TEST
socket.on('SocketValidationTest', function () {
console.log('AIGHT')
},
);
//METHODS
Meteor.methods({
foo: function () {
console.log(":(")
var cmd=require('node-cmd');
cmd.run('rundll32.exe powrprof.dll,SetSuspendState 0,1,0');
return 1;
},
bar: function () {
// QUESTION: HOW TO CALL Meteor.methods.foo
return 1 + foo;
},
'socket.sendMessage':function(){
socket.emit('my other event', { message: 'message' });
},
});
}
);
Каждый раз, когда я запускаю свое клиентское приложение, я думаю, что предпринимается попытка подключения, поскольку серверное приложение heroku начинает печатать следующие строки.
2019-09-26T20:33:23.248253+00:00 heroku[router]: at=info method=GET path="/socket.io/?EIO=3&transport=polling&t=MrlHqdj&b64=1" host=hwmonitool.herokuapp.com request_id=815b548d-dbd2-4fc4-8c07-4d26d5356058 fwd="190.85.77.232" dyno=web.1 connect=0ms service=4ms status=200 bytes=2026 protocol=http
2019-09-26T20:33:23.399404+00:00 heroku[router]: at=info method=POST path="/socket.io/?EIO=3&transport=polling&t=MrlHqg9&b64=1" host=hwmonitool.herokuapp.com request_id=419aa329-cbdb-48bc-bc7c-0bf7ecec20ca fwd="190.85.77.232" dyno=web.1 connect=0ms service=5ms status=200 bytes=2026 protocol=http
2019-09-26T20:33:28.412723+00:00 heroku[router]: at=info method=GET path="/socket.io/?EIO=3&transport=polling&t=MrlHruI&b64=1" host=hwmonitool.herokuapp.com request_id=96dcbfcb-4c3f-4e36-9125-76af5bba3f52 fwd="190.85.77.232" dyno=web.1 connect=1ms service=8ms status=200 bytes=2026 protocol=http
2019-09-26T20:33:28.547917+00:00 heroku[router]: at=info method=POST path="/socket.io/?EIO=3&transport=polling&t=MrlHrwk&b64=1" host=hwmonitool.herokuapp.com request_id=2c3bb984-9076-4b9f-a45b-e6883f12efe5 fwd="190.85.77.232" dyno=web.1 connect=0ms service=3ms status=200 bytes=2026 protocol=http
2019-09-26T20:33:33.566847+00:00 heroku[router]: at=info method=GET path="/socket.io/?EIO=3&transport=polling&t=MrlHt8t&b64=1" host=hwmonitool.herokuapp.com request_id=f6b7897a-18bd-4964-8041-f50d44574d53 fwd="190.85.77.232" dyno=web.1 connect=1ms service=4ms status=200 bytes=2026 protocol=http
2019-09-26T20:33:33.719816+00:00 heroku[router]: at=info method=POST path="/socket.io/?EIO=3&transport=polling&t=MrlHtBO&b64=1" host=hwmonitool.herokuapp.com request_id=65ceb84b-328a-4f45-9b35-efa735c465b0 fwd="190.85.77.232" dyno=web.1 connect=1ms service=10ms status=200 bytes=2026 protocol=http
2019-09-26T20:33:38.729319+00:00 heroku[router]: at=info method=GET path="/socket.io/?EIO=3&transport=polling&t=MrlHuPY&b64=1" host=hwmonitool.herokuapp.com request_id=1484a69f-bd67-4ad9-a03a-4c91d846c67b fwd="190.85.77.232" dyno=web.1 connect=1ms service=8ms status=200 bytes=2026 protocol=http
2019-09-26T20:33:38.881143+00:00 heroku[router]: at=info method=POST path="/socket.io/?EIO=3&transport=polling&t=MrlHuS3&b64=1" host=hwmonitool.herokuapp.com request_id=3adf54da-612b-4890-804d-f8701d5c67ea fwd="190.85.77.232" dyno=web.1 connect=0ms service=5ms status=200 bytes=2026 protocol=http
2019-09-26T20:33:43.882337+00:00 heroku[router]: at=info method=GET path="/socket.io/?EIO=3&transport=polling&t=MrlHvgC&b64=1" host=hwmonitool.herokuapp.com request_id=ad78dfac-1cac-4d25-9941-97fe29074538 fwd="190.85.77.232" dyno=web.1 connect=0ms service=3ms status=200 bytes=2026 protocol=http
2019-09-26T20:33:44.030293+00:00 heroku[router]: at=info method=POST path="/socket.io/?EIO=3&transport=polling&t=MrlHviW&b64=1" host=hwmonitool.herokuapp.com request_id=adef9a95-a249-4c03-bdb4-1b224e50bf63 fwd="190.85.77.232" dyno=web.1 connect=0ms service=5ms status=200 bytes=2026 protocol=http
2019-09-26T20:33:49.039047+00:00 heroku[router]: at=info method=GET path="/socket.io/?EIO=3&transport=polling&t=MrlHwwg&b64=1" host=hwmonitool.herokuapp.com request_id=2427bba1-48a1-4a49-9aa6-4804716a4fbd fwd="190.85.77.232" dyno=web.1 connect=1ms service=4ms status=200 bytes=2026 protocol=http
2019-09-26T20:33:49.200997+00:00 heroku[router]: at=info method=POST path="/socket.io/?EIO=3&transport=polling&t=MrlHwz7&b64=1" host=hwmonitool.herokuapp.com request_id=619d9b26-b2c6-4851-a16b-4c44c162a01a fwd="190.85.77.232" dyno=web.1 connect=0ms service=6ms status=200 bytes=2026 protocol=http
2019-09-26T20:33:54.197094+00:00 heroku[router]: at=info method=GET path="/socket.io/?EIO=3&transport=polling&t=MrlHyBG&b64=1" host=hwmonitool.herokuapp.com request_id=413a834d-85e2-475b-9a0a-ddf3a4a8bcab fwd="190.85.77.232" dyno=web.1 connect=0ms service=5ms status=200 bytes=2026 protocol=http
2019-09-26T20:33:54.348955+00:00 heroku[router]: at=info method=POST path="/socket.io/?EIO=3&transport=polling&t=MrlHyDh&b64=1" host=hwmonitool.herokuapp.com request_id=3d3105b5-35b4-4422-858f-519df67a1125 fwd="190.85.77.232" dyno=web.1 connect=0ms service=4ms status=200 bytes=2026 protocol=http
2019-09-26T20:33:59.560996+00:00 heroku[router]: at=info method=POST path="/socket.io/?EIO=3&transport=polling&t=MrlHzVC&b64=1" host=hwmonitool.herokuapp.com request_id=189a264a-a244-4632-b64b-31c50a90dd34 fwd="190.85.77.232" dyno=web.1 connect=1ms service=4ms status=200 bytes=2026 protocol=http
2019-09-26T20:33:59.414639+00:00 heroku[router]: at=info method=GET path="/socket.io/?EIO=3&transport=polling&t=MrlHzRq&b64=1" host=hwmonitool.herokuapp.com request_id=8e26e925-449d-409a-b46c-ac4660ba8789 fwd="190.85.77.232" dyno=web.1 connect=0ms service=8ms status=200 bytes=2026 protocol=http
2019-09-26T20:34:04.570754+00:00 heroku[router]: at=info method=GET path="/socket.io/?EIO=3&transport=polling&t=MrlH-jM&b64=1" host=hwmonitool.herokuapp.com request_id=a82e8a58-b9aa-40b6-9cd6-a46c61d65e50 fwd="190.85.77.232" dyno=web.1 connect=1ms service=7ms status=200 bytes=2026 protocol=http
2019-09-26T20:34:04.720824+00:00 heroku[router]: at=info method=POST path="/socket.io/?EIO=3&transport=polling&t=MrlH-ln&b64=1" host=hwmonitool.herokuapp.com request_id=c305a604-da21-42b0-ba19-348afc89054a fwd="190.85.77.232" dyno=web.1 connect=0ms service=5ms status=200 bytes=2026 protocol=http
2019-09-26T20:34:09.723010+00:00 heroku[router]: at=info method=GET path="/socket.io/?EIO=3&transport=polling&t=MrlH_zv&b64=1" host=hwmonitool.herokuapp.com request_id=0d4a471f-6012-414d-bbab-0447b545bec0 fwd="190.85.77.232" dyno=web.1 connect=0ms service=8ms status=200 bytes=2026 protocol=http
2019-09-26T20:34:09.882613+00:00 heroku[router]: at=info method=POST path="/socket.io/?EIO=3&transport=polling&t=MrlI00J&b64=1" host=hwmonitool.herokuapp.com request_id=c44c6d64-8bb7-473d-8ff3-ddf4b42c6f1d fwd="190.85.77.232" dyno=web.1 connect=1ms service=13ms status=200 bytes=2026 protocol=http
2019-09-26T20:34:14.875853+00:00 heroku[router]: at=info method=GET path="/socket.io/?EIO=3&transport=polling&t=MrlI1ER&b64=1" host=hwmonitool.herokuapp.com request_id=72f083b6-d06b-4504-bf5d-e45a433ec23c fwd="190.85.77.232" dyno=web.1 connect=0ms service=5ms status=200 bytes=2026 protocol=http
2019-09-26T20:34:15.030964+00:00 heroku[router]: at=info method=POST path="/socket.io/?EIO=3&transport=polling&t=MrlI1Go&b64=1" host=hwmonitool.herokuapp.com request_id=673699c2-0851-47b2-b60e-f8997cde5361 fwd="190.85.77.232" dyno=web.1 connect=1ms service=8ms status=200 bytes=2026 protocol=http
2019-09-26T20:34:20.033573+00:00 heroku[router]: at=info method=GET path="/socket.io/?EIO=3&transport=polling&t=MrlI2Uw&b64=1" host=hwmonitool.herokuapp.com request_id=a9da6da5-396b-4753-9e5d-512493c53475 fwd="190.85.77.232" dyno=web.1 connect=1ms service=9ms status=200 bytes=2026 protocol=http
2019-09-26T20:34:20.196098+00:00 heroku[router]: at=info method=POST path="/socket.io/?EIO=3&transport=polling&t=MrlI2XR&b64=1" host=hwmonitool.herokuapp.com request_id=c722107d-99ab-450b-84e6-d1b5109085e7 fwd="190.85.77.232" dyno=web.1 connect=1ms service=12ms status=200 bytes=2026 protocol=http
2019-09-26T20:34:25.191264+00:00 heroku[router]: at=info method=GET path="/socket.io/?EIO=3&transport=polling&t=MrlI3la&b64=1" host=hwmonitool.herokuapp.com request_id=c9a6ab60-aab4-46d2-9dff-48e79e542f4b fwd="190.85.77.232" dyno=web.1 connect=1ms service=5ms status=200 bytes=2026 protocol=http
2019-09-26T20:34:25.351664+00:00 heroku[router]: at=info method=POST path="/socket.io/?EIO=3&transport=polling&t=MrlI3n-&b64=1" host=hwmonitool.herokuapp.com request_id=660c977f-3b42-4878-b912-fccc5a8fb67a fwd="190.85.77.232" dyno=web.1 connect=1ms service=10ms status=200 bytes=2026 protocol=http
2019-09-26T20:34:30.346371+00:00 heroku[router]: at=info method=GET path="/socket.io/?EIO=3&transport=polling&t=MrlI508&b64=1" host=hwmonitool.herokuapp.com request_id=8225df63-8b7b-4105-a6c1-95bcd8069616 fwd="190.85.77.232" dyno=web.1 connect=0ms service=3ms status=200 bytes=2026 protocol=http
2019-09-26T20:34:30.495179+00:00 heroku[router]: at=info method=POST path="/socket.io/?EIO=3&transport=polling&t=MrlI52Z&b64=1" host=hwmonitool.herokuapp.com request_id=4f37b176-c3cc-4a19-a986-5cab9e9e5522 fwd="190.85.77.232" dyno=web.1 connect=0ms service=5ms status=200 bytes=2026 protocol=http
Однако соединение никогда не устанавливается.Информация, предоставляемая системой отладки socket-io, не существует.Я не знаю, что может быть источником проблемы, и у меня закончились идеи.Я был бы очень признателен за некоторые идеи о том, что может быть проблема и как ее решить.СПАСИБО!