2016-06-06 8 views
2

Ist es möglich, mehrere Clients auf demselben UDP-Server zu haben? Ich möchte die gleichen Daten an alle angeschlossenen Clients senden.Mehrere Clients, die unter Verwendung von UDP in NodeJS mit demselben Server verbunden sind

Hier wäre eine Ausgangsprobe sein, wenn es irgendwie ... Ja

// Server 
var news = [ 
    "Borussia Dortmund wins German championship", 
    "Tornado warning for the Bay Area", 
    "More rain for the weekend" 
]; 

var dgram = require('dgram'); 
var server = dgram.createSocket("udp4"); 
server.bind(function() { 
    server.setBroadcast(true) 
    server.setMulticastTTL(128); 
    setInterval(broadcastNew, 3000); 
}); 

function broadcastNew() { 
    var message = new Buffer(news[Math.floor(Math.random() * news.length)]); 
    server.send(message, 0, message.length, 5007, "224.1.1.1"); 
    console.log("Sent " + message + " to the wire..."); 
} 

// Client 1 
var PORT = 5007; 
var dgram = require('dgram'); 
var client = dgram.createSocket('udp4'); 

client.on('listening', function() { 
    var address = client.address(); 
    console.log('UDP Client listening on ' + address.address + ":" + address.port); 
    client.setBroadcast(true) 
    client.setMulticastTTL(128); 
    client.addMembership('224.1.1.1'); 
}); 

client.on('message', function(message, remote) { 
    console.log('A: Epic Command Received. Preparing Relay.'); 
    console.log('B: From: ' + remote.address + ':' + remote.port + ' - ' + message); 
}); 

client.bind(PORT); 

// Client 2 

// Here would go another client, it is possible ? 

Antwort

3

hilft, es ist möglich.

Ich werde nicht auf eine Rede darüber gehen, wie Sie TCP vor UDP verwenden sollten und UDP nur verwenden, wenn absolut notwendig.

Für Ihr Problem ist die Tatsache, dass UDP keine "Verbindung" hat. Sie erhalten Nachrichten, Sie senden Nachrichten, aber es gibt keine "Verbindung".

Also, was Sie tun sollten, ist:

  • Wenn eine Nachricht von einem eingehenden Client empfangen, speichern Sie die IP/Port vom Client verwendete
  • zu wollen, wenn Nachrichten an Kunden senden, an alle senden IP/Port-Kombinationen
  • in regelmäßigen Abständen alte Kunden entfernen (zum Beispiel, die nicht eine Nachricht in den letzten 5 Minuten gesendet hat) gespeichert

Sie können erkennen, wenn eine Nachricht auf einem gebundenen soc empfangen wird nach dem Ereignis "Nachricht" Ihr Code würde so ähnlich aussehen (helped myself):

// Server 
var news = [ 
    "Borussia Dortmund wins German championship", 
    "Tornado warning for the Bay Area", 
    "More rain for the weekend" 
]; 

var clients = {}; 

const dgram = require('dgram'); 
const server = dgram.createSocket('udp4'); 

server.on('error', (err) => { 
    console.log(`server error:\n${err.stack}`); 
    server.close(); 
}); 

server.on('message', (msg, rinfo) => { 
    console.log(`server got: ${msg} from ${rinfo.address}:${rinfo.port}`); 

    clients[JSON.stringify([rinfo.address, rinfo.port])] = true; 
    //use delete clients[client] to remove from the list of clients 
}); 

function broadCastNew() { 
    var message = new Buffer(news[Math.floor(Math.random() * news.length)]); 

    for (var client in clients) { 
     client = JSON.parse(client); 
     var port = client[1]; 
     var address = client[0]; 
     server.send(message, 0, message.length, port, address); 
    } 

    console.log("Sent " + message + " to the wire..."); 
} 

server.on('listening',() => { 
    var address = server.address(); 
    console.log(`server listening ${address.address}:${address.port}`); 

    setInterval(broadcastNew, 3000); 
}); 

server.bind(5007); 

Nun, wenn Ihr Server eine UDP-Nachricht auf Port 5007 bekommt, wird es den Absender zur Liste der Kunden hinzuzufügen, und alle 3 Sekunden wird es eine Nachricht senden an alle gespeicherten Clients. Wie man den Absender dazu bringt, diese Nachricht zu erhalten, ist eine andere Geschichte, aber Sie können ein Tool wie WireShark verwenden, um sich selbst zu bestätigen, dass es korrekt zurückgeschickt wurde.

Hier habe ich nicht alte Kunden löschen, aber Sie sollten wahrscheinlich einen Mechanismus enthalten, das letzte Mal zu speichern, sie mit Ihnen in Kontakt gebracht (statt = true verwenden Sie können zum Beispiel speichert aktuelle Zeit, dann regelmäßig alte Clients entfernen)

Broadcast und Multicast unterscheiden sich wahrscheinlich von dem, was Sie sich vorstellen, Broadcast wird beispielsweise verwendet, um eine Nachricht an alle im lokalen Netzwerk zu senden.