2016-03-19 11 views
1

Ich habe eine bestimmte Situation. Ich habe Client (Browser), der eine Verbindung zu Server A herstellt. Server A ist mit Server B und C verbunden. Wenn Client eine Nachricht an Server A sendet, muss ich eine Nachricht an einen bestimmten Server senden, dh an einen der Server B oder C beide. Im Allgemeinen brauche ich getrennte Kommunikation zwischen Servern, aber ich habe nur Kommunikation übertragen. Die Nachricht von Server A an einen anderen Server kann nicht auf allen verbundenen Servern angezeigt werden.Socket.io Server zu Server (Senden von Nachrichten an bestimmte Server)

Wie kann ich Nachrichten direkt an einen der Server senden? Hier ist mein Code-Snippet für Server. Ich ändere nur die Ports für jeden Server und verbinde sie.

// Load requirements 
var PORT = process.env.PORT || 8080;//just change port for other servers 
var express = require("express"); 
var app = express(); 
var http = require("http").Server(app); 
var io = require("socket.io")(http); 

app.use(express.static(__dirname + '/public')); 

var client = require('socket.io-client'); 

var socket1 = client.connect('http://localhost:8081', { reconnect: true });//connection to server B 
var socket2 = client.connect('http://localhost:8082', { reconnect: true });//connection to server C 

// Add a connect listener 
io.on('connection', function (socket) { 
    console.log('Client connected.'); 
//when server receive message from client 
    socket.on('message_from_browser', function (message) { 
     console.log("Message from browser broadcasted: " + message.text); 
     var updated_message = { 
      text: message.text, 
      port: PORT 
     }; 

     // send message to server B 
     socket1.emit('server_message', updated_message);//send message to server B 
    }); 

    // Disconnect listener 
    socket.on('disconnect', function() { 
     console.log('Client disconnected.'); 
    }); 
}); 

socket1.on('connect', function() { 
    socket1.on('server_message', function (message) { 
     console.log('RECEIVED MESSAGE FROM ANOTHER SERVER ON PORT '+ message.port + ": " + message.text); 
    }); 
    //change server name 
    console.log('Connected to server B!'); 
}); 

socket2.on('connect', function() { 
    socket2.on('server_message', function (message) { 
     console.log('RECEIVED MESSAGE FROM ANOTHER SERVER ON PORT '+ message.port + ": " + message.text); 
    }); 
    //change server name 
    console.log('Connected to server C!'); 
}); 

http.listen(PORT, function (req, res) { 
    console.log("Server Started on port: " + PORT); 
}); 
+0

Ich verstehe vielleicht die Frage nicht, weil die Antwort so einfach scheint, wie Sie die Nachricht nur an den gewünschten Server senden. Wenn Sie socket.io-Verbindungen sowohl zu Server B als auch zu Server C haben und eine eingehende Nachricht nur an Server B gesendet werden soll, dann erhalten Sie den Socket für die Verbindung zu Server B und Sie tun 'socket.emit()' on nur diese Steckdose. Dadurch wird die Nachricht nur an diese Verbindung gesendet. Wenn Server A die Verbindungen zu Server B und Server C initiiert hat, wissen Sie bereits, welche Verbindung welche ist. – jfriend00

+0

Wenn Server B und Server C mit Ihnen verbunden sind, benötigen Sie sie, um zu identifizieren, welche sie sind, wenn sie eine Verbindung herstellen, damit Sie verfolgen können, welche welche ist. – jfriend00

+0

Vielen Dank für Ihre Ratschläge. Ich habe deine Lösung versucht, aber wenn ich 2 Sockets erstellen und dann, wenn ich eine Nachricht wie socket.emit senden ('server_message', updated_message); oder socket2.emit ('server_message', aktualisierte_nachricht); das funktioniert nicht und als ich versuchte, eine Nachricht wie socket.emit ('server_message', updated_message); zu senden, sendete diese Nachricht auch an socket2. Als Sie den zweiten Kommentar eingegeben haben, habe ich auch Track-Server mit Socket-ID ausprobiert, aber es hat auch nicht funktioniert. – mattafix19

Antwort

1

Sie haben einen Namenskonflikt mit dem Variablennamen socket. Es ist sowohl als Ihre Verbindung zu Server B als auch als ein Argument in Ihrem .on('connection', function(socket) {...}) Callback definiert.

Um das zu beheben, ändern Sie diese:

var socket = client.connect('http://localhost:8081', { reconnect: true });//connection to server B 
var socket2 = client.connect('http://localhost:8082', { reconnect: true });//connection to server C 

Um dies:

var socket1 = client.connect('http://localhost:8081', { reconnect: true });//connection to server B 
var socket2 = client.connect('http://localhost:8082', { reconnect: true });//connection to server C 

Und dann beziehen sich auf die Server-B-Verbindung als socket1, nicht socket.

Die Variable socket genannt bereits als Argument in dieser definiert ist, so dass Sie nicht die äußere socket Variable erreichen, wenn es einen Konflikt stehenden Namen hat:

// Add a connect listener 
io.on('connection', function (socket) { 
    // socket variable name ^^^^^^ 
    console.log('Client connected.'); 
//when server receive message from client 
    socket.on('message_from_browser', function (message) { 
     console.log("Message from browser broadcasted: " + message.text); 
     var updated_message = { 
      text: message.text, 
      port: PORT 
     }; 

     // send message to server B 
     socket1.emit('server_message', updated_message);//send message to server B 
    }); 

    // Disconnect listener 
    socket.on('disconnect', function() { 
     console.log('Client disconnected.'); 
    }); 
}); 

Und es gab keine Zuhörer für eingehende Server-Nachrichten, so dass Sie benötigen Hinzufügen von Listenern für socket1 und socket2.

io.on('connect', function(socket1){ 
    socket1.on('server_message', function (message) { 
     console.log('RECEIVED MESSAGE FROM ANOTHER SERVER ON PORT '+ message.port + ": " + message.text); 
    }); 
}); 

io.on('connect', function(socket2){ 
    socket2.on('server_message', function (message) { 
     console.log('RECEIVED MESSAGE FROM ANOTHER SERVER ON PORT '+ message.port + ": " + message.text); 
    }); 
}); 
+0

Ich habe Ihr Update versucht, aber es scheint, dass der zweite Server keine Nachrichten korrekt empfängt. Ich habe es debuggt und Nachricht scheint korrekt zu senden, aber ein anderer Server zeigt keine Nachrichten an. – mattafix19

+0

@ mattafix19 - Noch einmal können wir Ihnen bei diesem Problem nicht helfen, es sei denn, Sie zeigen uns Ihren aktuellen Code für das Senden und Empfangen von Nachrichten. Socket.io funktioniert bei richtiger Verwendung einwandfrei. – jfriend00

+0

Entschuldigung dafür. Ich verstehe es komplett, aber mein Code ist der gleiche, aber nur der Unterschied ist behoben, den Sie empfohlen haben. Und dieser Code wird zum Senden und Empfangen bereitgestellt. Und nochmals vielen Dank für Ihre Zeit. – mattafix19

-1

Verwenden Sie eine Variable und configs andere Hosts zu verfolgen, versuchen:

Aktualisiert einige Fehler zu beheben:

// Load requirements 
var PORT = process.env.PORT || 8081;//just change port for other servers 
var express = require("express"); 
var app = express(); 
var http = require("http").Server(app); 
var io = require("socket.io")(http); 
var async = require('async'); // async is optional for this example ... 
var client = require('socket.io-client'); 

app.use(express.static(__dirname + '/public')); 

// save hosts here ... 
var otherServers = { 
    server1: { 
    url: 'http://localhost:8082' 
    }, 
    server2: { 
    url: 'http://localhost:8083' 
    }, 
}; 

// Add a connect listener 
io.on('connection', function (socket) { 
    console.log('Client connected.'); 
    //when server receive message from client 
    socket.on('message_from_browser', function (message) { 
     console.log("Message from browser broadcasted: " + message.text); 
     var updated_message = { 
     text: message.text, 
     port: PORT 
     }; 

     // choice how server will receive this message ... 
     // then send it 
     otherServers.server1.client.broadcast.emit('server_message', updated_message); 
    }); 

    // Disconnect listener 
    socket.on('disconnect', function() { 
     console.log('Client disconnected.'); 
    }); 
}); 

async.each(otherServers, function forEachOtherServer(otherServer, next) { 
    //connect to another server 
    otherServer.client = client.connect(otherServer.url, { reconnect: true }); 
    // to something more if need in every client connection ... 

    otherServer.client.on('connect', function (x) { 

    otherServer.client.on('server_message', function (message) { 
     console.log('RECEIVED MESSAGE FROM ANOTHER SERVER ON PORT '+ message.port + ": " + message.text); 
     //socket.broadcast.emit('message_from_server', message_server); 
    }); 
    console.log('Connected!'); 
    }); 

    next(); 
}, function afterConnectInAllServers(err) { 
    if (err) throw err; 
    // to something after connect in all servers ... 
}); 

http.listen(PORT, function (req, res) { 
    console.log("Server Started on port: " + PORT); 
}); 
+0

Vielen Dank für Ihre Hilfe. Tatsächlich kann ich deinen Code nicht zum Funktionieren bringen. Ich kann keine Verbindung zwischen Servern herstellen. Und wenn ich versuche, Nachrichten vom Browser weiterzuleiten, bekomme ich einen Fehler auf 'otherServers.server1.client.broadcast.emit ('server_message', updated_message);' line, Fehlender Fehlerhandler auf 'socket'. TypeError: Kann die Eigenschaft 'broadcast' von undefined – mattafix19

+0

nicht lesen Verwenden Sie die console.log ('otherServers'); um alle verbundenen Server zu sehen. Und ich aktualisierte diesen Beispielcode für einige Fehler zu beheben –

+0

Vielen Dank für Ihre schnellen Antworten. Ich sehe, dass Sie in Ihrem Code 'async.each (otherServers, function forEachOtherServer (otherServer, next) {') erstellt haben. Das bedeutet, dass Sie für jeden Server im Objekt 'otherServers' eine Verbindung herstellen, oder? ... tue etwas. Eigentlich habe ich noch Fehler wie im letzten Kommentar. Es scheint, dass ich keine Verbindung zwischen Servern erstellt habe. Grund, warum ich das brauche, ist, dass ich am CDN-Netzwerkadapter arbeite und ich muss Kommunikation erstellen zwischen den Servern im CDN-Netzwerk, aber die Nachrichten müssen direkt an ausgewählte Server gesendet werden – mattafix19

Verwandte Themen