Comment connecter deux serveurs Node.js avec websockets?
Question
Voici mon problème:
Je serveur A, en cours d'exécution en utilisant Node.js et socket.io pour communiquer avec les clients (navigateurs Web). Tout cela fonctionne très bien et dandy.
Cependant, maintenant que j'ai le serveur B, qui doit également se connecter au serveur A à websockets, je l'ai frappé un mur. Aucun des clients WebSocket Node.js que j'ai trouvé ne fonctionnera pas avec le socket.io sur le serveur A.
Alors, c'est le cas, je me efforce pour:
.--------. .----------. .----------.
| CLIENT | <--> | SERVER A | <--> | SERVER B |
'--------' '----------' '----------'
connexion client-serveur A est fait par socket.io
Maintenant, le serveur B (en cours d'exécution Node.js) doit se connecter au serveur A via websocket (pour 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 erreur et se termine d'exécution après quelques secondes.
Mise à jour: Les exemples de code
ressemble à ce serveur (qui fonctionne très bien):
// 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.');
});
});
ressemble client comme celui-ci
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 imprime très bien, pas d'erreurs, et quelques secondes plus tard, le processus juste sorties
En outre, le serveur A ne sort pas quoi que ce soit dans le journal, même si je l'ensemble de l'exploitation forestière socket.io sur « tout ».
La solution
Il se trouve que j'utilisais des exemples anciens, pour une raison quelconque, même si je les ai vérifiés triple. Eh bien, doh.
En outre, il est avéré que le socket.io-client est cassé sur le dernier nœud (6.x.x). Réussi à trouver une mise à jour github pour elle, a remplacé les fichiers et youpi, tout fonctionne!
Modifier : Malheureusement, je ne l'ai pas sauver des liens vers des exemples de travail, mais après l'écrémage rapidement à travers le code, il semble que les seuls changements étaient 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');
Autres conseils
Pour les futurs gens:
Voici 2 applications Node.js
très simples que l'utilisation socket.io pour se connecter, envoyer et recevoir des messages entre eux.
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 + "'");
});
});
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 (Socket.io Client) <---> Serveur B (Socket.io Server)
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 de client, il ne se connecte pas