2012-01-12 71 views
45

Aquí está mi problema:¿Cómo conectar dos servidores node.js con websockets?

Tengo el servidor A, ejecutando node.js y usando socket.io para comunicarme con clientes (navegadores web). Todo esto funciona bien y elegante.

Sin embargo, ahora que tengo el servidor B, que también necesita conectarse al servidor A a través de websockets, he chocado contra una pared. Ninguno de los clientes WebSocket Node.js que he encontrado no funcionará con el socket.io en el servidor A.

Por lo tanto, este es el caso que estoy luchando por:

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

Cliente -server Una conexión se realiza a través de socket.io

Ahora, el servidor B (que se ejecuta node.js) debe conectarse al servidor A a través de websocket (para pasar por el puerto 80). Pero ...

Incluso el código de ejemplo en el módulo socket.io-cliente no funciona ...:/

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

El código sólo pasa sin ningún error y la ejecución termina después de unos segundos.

Actualización: Ejemplos de código

servidor (que funciona muy bien) es el siguiente:

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

cliente se parece a esta

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 y 3 imprime bien , sin errores, y unos segundos más tarde el proceso simplemente sale de

Además, el servidor A no produce cualquier cosa en el registro, a pesar de que tengo el registro socket.io establecido en "todo".

+1

¿Definitivamente usted es un cliente de websockets o puede simplemente usar enchufes simples? – maerics

+0

'los clientes de websocket node.js que he encontrado' ¿cuáles? – Kato

+0

Necesito al menos emular websockets ya que necesito conectarme al mismo servidor. – crappish

Respuesta

22

Resulta que estaba usando ejemplos antiguos, por alguna razón, aunque los compré por triplicado. Bueno, doh.

Además, resultó que socket.io-client está roto en el último nodo (6.x.x). Logré encontrar una actualización de github para él, reemplacé los archivos y ¡sí, todo está funcionando!

Editar: Por desgracia, no guardo ningún enlace a ejemplos de trabajo, pero después de rozar con rapidez a través del código parece que los únicos cambios fueron para el código de cliente, que ahora se ve así:

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

¿Puedes publicar los nuevos ejemplos o señalarlos? Estoy enfrentando exactamente el mismo problema que enfrentaste. – Sudar

+0

Lamentablemente no guardé ningún enlace, pero revisé el código de trabajo y actualizaré la diferencia que encontré a la respuesta anterior. – crappish

+0

También obtuve mi código funcionando. En mi caso, no había especificado el puerto. El código comenzó a funcionar después de que agregué el puerto. – Sudar

5

Aquí hay un fragmento de código que escribí, está usando socket.io 1.0.6 y socket.io-client 1.0.6. El caso es el siguiente:

Servidor A (Cliente Socket.io) < ---> Servidor B (Socket.io Server)

servidor B (servidor):

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

Servidor A (Cliente):

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

Si estoy usando localhost: 8080 sólo en el servidor del cliente no se conecta

+0

esto funcionó para mí ... –

7

Para las personas futuras:
Aquí es muy simples 2 Node.js aplicaciones que utilizan socket.io para conectar, enviar y recibir mensajes entre sí.

paquete requerido es:

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