web-dev-qa-db-fra.com

Comment connecter deux serveurs node.js avec des websockets?

Voici mon problème:

J'ai le serveur A, exécutant node.js et utilisant socket.io pour communiquer avec les clients (navigateurs Web). Tout cela va bien et dandy.

Cependant, maintenant que j'ai le serveur B, qui doit également se connecter au serveur A via des websockets, j'ai heurté un mur. Aucun des clients websocket node.js que j'ai trouvés ne fonctionnera avec le socket.io sur le serveur A.

C'est donc le cas pour lequel je m'efforce:

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

Client-serveur Une connexion est établie via socket.io

Maintenant, le serveur B (exécutant node.js) devrait se connecter au serveur A via le websocket (afin de passer par le port 80). Mais...

Même l'exemple de code dans le module socket.io-client ne fonctionne pas ...: /

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

Le code passe juste sans aucune erreur et l'exécution se termine après quelques secondes.

Mise à jour: exemples de code

Le serveur (qui fonctionne très bien) ressemble à ceci:

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

Le client ressemble à ceci

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 et 3 s'imprime très bien, aucune erreur et quelques secondes plus tard, le processus se termine

De plus, le serveur A ne produit rien dans le journal, même si la journalisation socket.io est définie sur "tout".

57
crappish

Il s'avère que j'utilisais d'anciens exemples, pour une raison quelconque, même si je les ai vérifiés trois fois. Et bien.

En outre, il s'est avéré que le socket.io-client est cassé le dernier Node (6.xx). A réussi à trouver une mise à jour de github pour lui, a remplacé les fichiers et yay, tout fonctionne !

Edit : Malheureusement, je n'ai pas enregistré de liens vers des exemples de travail, mais après avoir parcouru rapidement le code, il semble que les seules modifications ont été apportées au code client, qui ressemble maintenant à ceci:

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

Pour les futures personnes:
Voici 2 très simples Node.js applications qui utilisent socket.io pour se connecter, envoyer et recevoir des messages entre eux.

Le package requis est:

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

Voici un extrait de code que j'ai écrit, il utilise socket.io 1.0.6 et socket.io-client 1.0.6. Le cas est le suivant:

Serveur A (client Socket.io) <---> Serveur B (serveur Socket.io)

Serveur B (Serveur):

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

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

Si j'utilise localhost: 8080 uniquement sur le serveur client, il ne se connecte pas.

10
Regnoult