Come collegare due server Node.js con WebSocket?
Domanda
Ecco il mio problema:
Ho il server A, eseguendo node.js e utilizzando socket.io per comunicare con i client (browser Web). Tutto questo funziona bene e dandy.
Tuttavia, ora che ho il server B, che deve anche connettermi al server A tramite WebSocket, ho colpito un muro. Nessuno dei client WebSocket Node.js che ho trovato non funzionerà con Socket.io sul server A.
Quindi, questo è il caso per cui sto cercando:
.--------. .----------. .----------.
| CLIENT | <--> | SERVER A | <--> | SERVER B |
'--------' '----------' '----------'
Client-Server Una connessione viene eseguita tramite Socket.io
Ora, il server B (in esecuzione node.js) dovrebbe connettersi al server A tramite WebSocket (per passare attraverso la porta 80). Ma...
Anche il codice di esempio nel modulo socket.io-client non funziona ...:/
// Connect to server
var socket = new io.Socket('localhost', {port: 8080});
socket.connect();
// Add a connect listener
socket.on('connect', function(socket) {
console.log('Connected.');
});
Il codice passa senza errori e l'esecuzione termina dopo pochi secondi.
Aggiornamento: campioni di codice
Il server (che funziona bene) sembra questo:
// Load requirements
var http = require('http'),
io = require('socket.io');
// Create server & socket
var server = http.createServer(function(req, res){
// Send HTML headers and message
res.writeHead(404, {'Content-Type': 'text/html'});
res.end('<h1>Aw, snap! 404</h1>');
});
server.listen(8080);
io = io.listen(server);
// Add a connect listener
io.sockets.on('connection', function(socket) {
console.log('Client connected.');
// Disconnect listener
socket.on('disconnect', function() {
console.log('Client disconnected.');
});
});
Il cliente sembra così
console.log('1');
// Connect to server
var io = require('socket.io-client')
var socket = new io.Socket('localhost', {port: 8080});
socket.connect();
console.log('2');
// Add a connect listener
socket.on('connect', function(socket) {
console.log('Connected!');
});
console.log('3');
1, 2 e 3 stampano bene, nessun errore e pochi secondi dopo il processo esce
Inoltre, il server A non emette nulla al registro, anche se ho la registrazione Socket.io impostata su "tutto".
Soluzione
Si scopre che stavo usando vecchi esempi, per qualche motivo, anche se li ho controllati. Bene, doh.
Inoltre, si è scoperto che Socket.io-client è rotto sull'ultimo nodo (6.xx). Sono riuscito a trovare un aggiornamento da GitHub per questo, ha sostituito i file e Yay, tutto funziona!
Modificare: Sfortunatamente non ho salvato alcun link agli esempi di lavoro, ma dopo aver rapidamente sfogliato il codice sembra che le uniche modifiche fossero al codice client, che ora sembra così:
console.log('1');
// Connect to server
var io = require('socket.io-client')
var socket = io.connect('localhost:8080', {reconnect: true});
console.log('2');
// Add a connect listener
socket.on('connect', function(socket) {
console.log('Connected!');
});
console.log('3');
Altri suggerimenti
Per le persone future:
Ecco 2 molto semplice Node.js
app che usano Socket.io Per connettersi, inviare e ricevere messaggi l'uno tra loro.
Il pacchetto richiesto è:
npm install socket.io
Node-App-1 server.js:
var io = require('socket.io').listen(3000);
io.on('connection', function (socket) {
console.log('connected:', socket.client.id);
socket.on('serverEvent', function (data) {
console.log('new message from client:', data);
});
setInterval(function () {
socket.emit('clientEvent', Math.random());
console.log('message sent to the clients');
}, 3000);
});
Node-App-2 client.js:
var io = require('socket.io-client');
var socket = io.connect("http://localhost:3000/", {
reconnection: true
});
socket.on('connect', function () {
console.log('connected to localhost:3000');
socket.on('clientEvent', function (data) {
console.log('message from the server:', data);
socket.emit('serverEvent', "thanks server! for sending '" + data + "'");
});
});
Ecco uno snippet di codice che ho scritto, sta usando Socket.io 1.0.6 e Socket.IO-Client 1.0.6. Il caso è il seguente:
Server A (Socket.io Client) <---> server B (Socket.io Server)
Server B (server):
// Load requirements
var http = require('http'),
io = require('socket.io');
// Create server & socket
var server = http.createServer(function(req, res)
{
// Send HTML headers and message
res.writeHead(404, {'Content-Type': 'text/html'});
res.end('<h1>Aw, snap! 404</h1>');
});
server.listen(8080);
io = io.listen(server);
// Add a connect listener
io.sockets.on('connection', function(socket)
{
console.log('Client connected.');
// Disconnect listener
socket.on('disconnect', function() {
console.log('Client disconnected.');
});
});
Server A (client):
console.log('1');
// Connect to server
var io = require('socket.io-client');
var socket = io.connect('http://localhost:8080', {reconnect: true});
console.log('2');
// Add a connect listener
socket.on('connect', function(socket) {
console.log('Connected!');
});
console.log('3');
Se sto usando LocalHost: 8080 solo sul server client non si connette.