webSocketServer node.js how to differentiate clients

后端 未结 10 1926
[愿得一人]
[愿得一人] 2020-12-22 19:36

I am trying to use sockets with node.js, I succeded but I don\'t know how to differentiate clients in my code. The part concerning sockets is this:

var WebSo         


        
相关标签:
10条回答
  • 2020-12-22 20:18

    In nodejs you can directly modify the ws client and add custom attributes for each client separately. Also you have a global variable wss.clients and can be used anywhere. Please try the next code and try to connect at leat two clients:

    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);
        });
    });
    

    You can also pass parameters directly in the client connection URL:

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

    In the connection function you can get these parameters and to assign these parameters directly to your ws client:

    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;
    }
    
    0 讨论(0)
  • 2020-12-22 20:18

    This code snippet in Worlize server really helped me a lot. Even though you're using ws, the code should be easily adaptable. I've selected the important parts here:

    // 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];
    

    Now you can easily create a broadcast() and sendToConnectionId() function as shown in the linked code.

    Hope that helps.

    0 讨论(0)
  • 2020-12-22 20:18

    It depends which websocket you are using. For example, the fastest one, found here: https://github.com/websockets/ws is able to do a broadcast via this method:

    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);
     });
    };
    

    Then later in your code you can use wss.broadcast(message) to send to all. For sending a PM to an individual user I do the following:

    (1) In my message that I send to the server I include a username (2) Then, in onMessage I save the websocket in the array with that username, then retrieve it by username later:

    wss.on('connection', function(ws) {
    
      ws.on('message', function(message) {
    
          users[message.userName] = ws;
    

    (3) To send to a particular user you can then do users[userName].send(message);

    0 讨论(0)
  • 2020-12-22 20:22

    you can use request header 'sec-websocket-key'

    wss.on('connection', (ws, req) => {
      ws.id = req.headers['sec-websocket-key']; 
    
      //statements...
    });
    
    0 讨论(0)
  • 2020-12-22 20:25

    You can simply assign users ID to an array CLIENTS[], this will contain all users. You can directly send message to all users as given below:

    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);
        }
    }
    
    0 讨论(0)
  • 2020-12-22 20:25

    If someone here is maybe using koa-websocket library, server instance of WebSocket is attached to ctx along side the request. That makes it really easy to manipulate the wss.clients Set (set of sessions in ws). For example pass parameters through URL and add it to Websocket instance something like this:

    const wss = ctx.app.ws.server
    const { userId } = ctx.request.query
    
    try{
    
       ctx.websocket.uid = userId
    
    }catch(err){
        console.log(err)
    }
    
    0 讨论(0)
提交回复
热议问题