2012-01-12 1 views
45

Ecco il mio problema:Come connettere due server node.js con websocket?

Ho il server A, eseguendo node.js e utilizzando socket.io per comunicare con i client (browser Web). Tutto sta funzionando bene e dandy.

Tuttavia, ora che ho il server B, che deve anche connettersi al server A tramite websockets, ho colpito un muro. Nessuno dei clienti websocket Node.JS che ho trovato non funziona con la socket.io sul server A.

Quindi, questo è il caso che sto lottando per:

.--------.  .----------.  .----------. 
| CLIENT | <--> | SERVER A | <--> | SERVER B | 
'--------'  '----------'  '----------' 

client -server Una connessione viene effettuata tramite socket.io

Ora, il server B (node.js in esecuzione) deve 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 solo senza errori e l'esecuzione termina dopo pochi secondi.

Aggiornamento: Esempi di codice

Server (che funziona bene) si presenta così:

// 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.'); 
    }); 
}); 

client sembra questo

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 stampe fuori proprio bene , nessun errore e pochi secondi dopo il processo esce semplicemente

Inoltre, il server A non viene emesso qualsiasi cosa al registro, anche se ho la registrazione socket.io impostata su "tutto".

+1

Sei un client di websockets o puoi semplicemente usare le vecchie prese? – maerics

+0

'i client websocket node.js che ho trovato' quali? – Kato

+0

Ho bisogno di emulare almeno websocket poiché ho bisogno di connettermi allo stesso server. – crappish

risposta

22

Si scopre che stavo usando vecchi esempi, per qualche motivo, anche se ho controllato tre volte. Bene, doh.

Inoltre, si è scoperto che il socket.io-client è rotto sull'ultimo nodo (6.x.x). È riuscito a trovare un aggiornamento da github per questo, ha sostituito i file e yay, tutto funziona!

Edit: Purtroppo non ho salvato tutti i link a esempi di lavoro, ma dopo la scrematura rapidamente attraverso il codice sembra che gli unici cambiamenti sono stati per il codice del client, che ora assomiglia a questo:

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'); 
+0

Puoi pubblicare i nuovi esempi o indicarli? Sto affrontando lo stesso identico problema che stavi affrontando. – Sudar

+0

Purtroppo non ho salvato alcun collegamento ma ho sfogliato il codice funzionante e aggiornerò la differenza che ho trovato nella risposta sopra. – crappish

+0

Ho anche ottenuto il mio codice funzionante. Nel mio caso non avevo specificato la porta. Il codice ha iniziato a funzionare dopo aver aggiunto la porta. – Sudar

5

Ecco uno snippet di codice che ho scritto, utilizza socket.io 1.0.6 e socket.io-client 1.0.6. Il caso è il seguente:

Server A (Client Socket.io) < ---> Server B (Presa.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.

+0

questo ha funzionato per me ... –

7

Per le persone future:
Ecco 2 semplici Node.js applicazioni che utilizzano socket.io per collegare, inviare e ricevere messaggi tra di loro.

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 + "'"); 
    }); 
});