67 votes

Comment connecter deux serveurs node.js avec des websockets ?

Voici mon problème :

J'ai un serveur A, qui exécute node.js et utilise socket.io pour communiquer avec les clients (navigateurs web). Tout cela fonctionne parfaitement.

Cependant, maintenant que j'ai un serveur B, qui doit également se connecter au serveur A via des websockets, je me heurte à un mur. Aucun des clients websocket node.js que j'ai trouvés ne fonctionne avec le socket.io du serveur A.

C'est donc le cas que je cherche à atteindre :

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

Client-serveur La connexion se fait via socket.io

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

Même le code d'exemple du 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 sans aucune erreur et l'exécution se termine après quelques secondes.

Mise à jour : échantillons 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'impriment parfaitement, sans erreur, et quelques secondes plus tard, le processus se termine.

De plus, le serveur A n'envoie rien dans le journal, bien que la journalisation de socket.io soit réglée sur "tout".

2 votes

Avez-vous besoin d'un client websockets ou pouvez-vous simplement utiliser de bons vieux sockets ?

0 votes

the node.js websocket clients I've found lesquels ?

0 votes

Je dois au moins émuler les websockets puisque je dois me connecter au même serveur.

33voto

rejnev Points 912

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

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

32voto

crappish Points 888

Il s'avère que j'ai utilisé de vieux exemples, pour une raison quelconque, même si je les ai vérifiés trois fois. Eh bien, doh.

Aussi, il s'est avéré que le client socket.io est cassé sur le dernier Node (6.x.x). J'ai réussi à trouver une mise à jour de github, j'ai remplacé les fichiers et yay, tout fonctionne !

Modifier : Malheureusement, je n'ai pas sauvegardé de liens vers des exemples de travail, mais après avoir rapidement parcouru le code, il semble que les seuls changements aient été apportés 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');

0 votes

Pouvez-vous afficher les nouveaux exemples ou les pointer ? Je rencontre exactement le même problème que vous.

0 votes

Malheureusement, je n'ai pas sauvegardé de liens mais j'ai parcouru le code de travail et je vais mettre à jour la différence que j'ai trouvée dans la réponse ci-dessus.

0 votes

J'ai également réussi à faire fonctionner mon code. Dans mon cas, je n'avais pas spécifié le port. Le code a commencé à fonctionner après que j'ai ajouté le port.

10voto

Regnoult Points 1

Voici un bout 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 (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.');
  });
});

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.

3voto

Selvatico Points 184

J'ai utilisé pour les communications entre les canaux du serveur socket.io redis.

0voto

Deniz Ozger Points 423

Vous pouvez également utiliser ZMQ ( https://npmjs.org/package/zmq ) pour la communication entre serveurs via des sockets.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X