it-swarm.com.de

webSocketServer node.js wie Clients unterschieden werden

Ich versuche, Sockets mit node.js zu verwenden, es ist mir gelungen, aber ich weiß nicht, wie ich Clients in meinem Code differenzieren kann ...

var WebSocketServer = require('ws').Server, 
    wss = new WebSocketServer({port: 8080});
wss.on('connection', function(ws) {
    ws.on('message', function(message) {
        console.log('received: %s', message); 
        ws.send(message);
    });
    ws.send('something');
});

Dieser Code funktioniert gut mit meinen Client-Js.

Ich möchte jedoch eine Nachricht an einen bestimmten Benutzer oder an alle Benutzer senden, die über Sockets auf meinem Server verfügen.

In meinem Fall sende ich eine Nachricht als Client und erhalte eine Antwort, die anderen Benutzer zeigen jedoch nichts.

Ich möchte zum Beispiel, dass user1 eine Nachricht über webSocket an den Server sendet und ich eine Benachrichtigung an user2 schicke, der seine Socket geöffnet hat.

45
Ajouve

Sie können einem Array CLIENTS [] einfach die Benutzer-ID zuweisen. Diese enthält alle Benutzer. Sie können die Nachricht wie unten angegeben direkt an alle Benutzer senden:

var WebSocketServer = require('ws').Server,
    wss = new WebSocketServer({port: 8080}),
    CLIENTS=[];

wss.on('connection', function(ws) {
    CLIENTS.Push(ws);
    ws.on('message', function(message) {
        console.log('received: %s', message);
        sendAll(message);
    });
    ws.send("NEW USER JOINED");
});

function sendAll (message) {
    for (var i=0; i<CLIENTS.length; i++) {
        CLIENTS[i].send("Message: " + message);
    }
}
43
Ankit Bisht

In nodejs können Sie den WS-Client direkt ändern und benutzerdefinierte Attribute für jeden Client separat hinzufügen. Sie haben auch eine globale Variable wss.clients und können überall verwendet werden. Versuchen Sie es mit dem nächsten Code und versuchen Sie, sich bei mindestens zwei Clients zu verbinden:

var WebSocketServer = require('ws').Server;
var wss = new WebSocketServer({
    server: httpsServer
});


wss.getUniqueID = function () {
    function s4() {
        return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);
    }
    return s4() + s4() + '-' + s4();
};

wss.on('connection', function connection(ws, req) {
    ws.id = wss.getUniqueID();

    wss.clients.forEach(function each(client) {
        console.log('Client.ID: ' + client.id);
    });
});

Sie können Parameter auch direkt in der Client-Verbindungs-URL übergeben: 

https://myhost:8080?myCustomParam=1111&myCustomID=2222

In der Verbindungsfunktion können Sie diese Parameter abrufen und diese Parameter direkt Ihrem ws-Client zuordnen:

wss.on('connection', function connection(ws, req) {

    const parameters = url.parse(req.url, true);

    ws.uid = wss.getUniqueID();
    ws.chatRoom = {uid: parameters.query.myCustomID};
    ws.hereMyCustomParameter = parameters.query.myCustomParam;
}
34
Jzapata

Dieses Code-Snippet in Worlize-Server hat mir sehr geholfen. Obwohl Sie ws verwenden, sollte der Code leicht anpassbar sein. Ich habe hier die wichtigen Teile ausgewählt:

// initialization
var connections = {};
var connectionIDCounter = 0;

// when handling a new connection
connection.id = connectionIDCounter ++;
connections[connection.id] = connection;
// in your case you would rewrite these 2 lines as
ws.id = connectionIDCounter ++;
connections[ws.id] = ws;

// when a connection is closed
delete connections[connection.id];
// in your case you would rewrite this line as
delete connections[ws.id];

Jetzt können Sie einfach eine broadcast () - und sendToConnectionId () - Funktion erstellen, wie im verknüpften Code gezeigt.

Hoffentlich hilft das.

7
H Dog

Es hängt davon ab, welchen Websocket Sie verwenden. Das schnellste Beispiel finden Sie hier: https://github.com/websockets/ws kann über diese Methode eine Übertragung durchführen:

var WebSocketServer = require('ws').Server,
   wss = new WebSocketServer({Host:'xxxx',port:xxxx}),
   users = [];
wss.broadcast = function broadcast(data) {
wss.clients.forEach(function each(client) {
  client.send(data);
 });
};

Dann können Sie später in Ihrem Code wss.broadcast (Nachricht) verwenden, um an alle zu senden. Um ein PM an einen einzelnen Benutzer zu senden, mache ich Folgendes:

(1) In meiner Nachricht, die ich an den Server schicke, gebe ich einen Benutzernamen .__ ein. (2) Dann speichere ich in onMessage den Websocket im Array mit diesem Benutzernamen ab und rufe ihn später mit dem Benutzernamen ab:

wss.on('connection', function(ws) {

  ws.on('message', function(message) {

      users[message.userName] = ws;

(3) Um an einen bestimmten Benutzer zu senden, können Sie Benutzer [Benutzername] .send (Nachricht) ausführen.

7
droid-zilla

sie können den Request-Header 'sec-websocket-key' verwenden.

wss.on('connection', (ws, req) => {
  ws.id = req.headers['sec-websocket-key']; 

  //statements...
});
3
Serhat Ates

Sie können das Verbindungsobjekt überprüfen. Es verfügt über eine integrierte Identifikation für jeden verbundenen Client. Sie finden es hier:

let id=ws._ultron.id;
console.log(id);
3
rrk jonnapalli

Ich verwende fd aus dem WS-Objekt. Es sollte pro Client eindeutig sein.

var clientID = ws._socket._handle.fd;

Ich erhalte eine andere Nummer, wenn ich einen neuen Browser-Tab öffne.

Die ersten ws hatten 11, die nächsten 12.

2

Eine mögliche Lösung hier könnte das Anhängen der deviceId vor der Benutzer-ID sein, sodass wir mehrere Benutzer mit derselben Benutzer-ID, aber auf unterschiedlichen Geräten, trennen können.

ws://xxxxxxx:9000/userID/<<deviceId>>

2
cyberrspiritt

Wenn Sie unter Clients die offenen Verbindungen meinen, können Sie ws.upgradeReq.headers['sec-websocket-key'] als Bezeichner verwenden. Halten Sie alle Socketobjekte in einem Array.

Wenn Sie jedoch Ihren Benutzer identifizieren möchten, müssen Sie dem Socket-Objekt benutzerspezifische Daten hinzufügen.

0

Wenn hier möglicherweise jemand die Bibliothek koa-websocket verwendet, wird die Serverinstanz von WebSocket neben der Anforderung an ctx angehängt. Das macht es sehr einfach, das wss.clients Set (Sitzungsgruppen in ws ) zu bearbeiten. Übergeben Sie zum Beispiel Parameter über die URL und fügen Sie sie der Websocket-Instanz hinzu.

const wss = ctx.app.ws.server
const { userId } = ctx.request.query

try{

   ctx.websocket.uid = userId

}catch(err){
    console.log(err)
}
0
Marko Balažic