webSocketServer node.js如何区分客户端

时间:2012-11-13 16:06:47

标签: node.js websocket

我正在尝试使用带有node.js的套接字,我成功但我不知道如何在我的代码中区分客户端。 关于套接字的部分是:

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

此代码适用于我的客户端js。

但我想向特定用户或在我的服务器上打开套接字的所有用户发送消息。

在我的情况下,我发送消息作为客户端,我收到回复,但其他用户没有显示任何内容。

我想例如user1通过webSocket向服务器发送消息,然后向打开套接字的用户2发送通知。

11 个答案:

答案 0 :(得分:45)

您可以简单地将用户ID分配给数组CLIENTS [],这将包含所有用户。您可以直接向所有用户发送消息,如下所示:

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

答案 1 :(得分:44)

在nodejs中,您可以直接修改ws客户端并分别为每个客户端添加自定义属性。您还有一个全局变量 wss.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);
    });
});

您还可以直接在客户端连接URL中传递参数:

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

在连接功能中,您可以获取这些参数并将这些参数直接分配给您的ws客户端:

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

答案 2 :(得分:8)

这取决于您使用的websocket。例如,最快的一个:https://github.com/websockets/ws能够通过这种方法进行广播:

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

然后在您的代码中,您可以使用wss.broadcast(message)发送给所有人。要将PM发送给单个用户,请执行以下操作:

(1)在我发送给服务器的消息中,我包含了一个用户名 (2)然后,在onMessage中,我使用该用户名将websocket保存在数组中,然后通过用户名检索它:

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

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

      users[message.userName] = ws;

(3)要发送给特定用户,您可以执行用户[userName] .send(message);

答案 3 :(得分:7)

Worlize服务器中的

This code snippet对我帮助很大。即使您使用的是ws,代码也应该很容易适应。我在这里选择了重要的部分:

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

现在您可以轻松创建一个broadcast()和sendToConnectionId()函数,如链接代码所示。

希望有所帮助。

答案 4 :(得分:4)

您可以使用请求标头'sec-websocket-key'

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

  //statements...
});

答案 5 :(得分:3)

您可以检查连接对象。它为每个连接的客户端提供内置标识;你可以在这里找到它:

let id=ws._ultron.id;
console.log(id);

答案 6 :(得分:2)

我正在使用ws对象的fd。它应该是每个客户唯一的。

var clientID = ws._socket._handle.fd;

当我打开新的浏览器标签时,我得到一个不同的号码。

第一个ws有11个,下一个有12个。

答案 7 :(得分:2)

这里的一个可能的解决方案是将deviceId附加到用户ID之前,因此我们可以将具有相同用户ID但在不同设备上的多个用户分开。

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

答案 8 :(得分:0)

如果您指的是开放式连接,则客户端可以使用ws.upgradeReq.headers['sec-websocket-key']作为标识符。并将所有套接字对象保存在一个数组中。

但是如果你想识别你的用户,那么你需要将用户特定的数据添加到套接字对象。

答案 9 :(得分:0)

如果这里有人正在使用koa-websocket库,则WebSocket的服务器实例将与请求一起附加到ctx上。这使得操作wss.clients集(ws中的会话集)非常容易。例如,通过URL传递参数并将其添加到Websocket实例中,如下所示:

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

try{

   ctx.websocket.uid = userId

}catch(err){
    console.log(err)
}

答案 10 :(得分:0)

使用全局计数器变量并为每个新连接分配其值:

const wss = new WebSocket.Server({server});
let count_clients = 0;
wss.on('connection', function connection(ws){
    ws.id=count_clients++;
    console.log(`new connection, ws.id=${ws.id}, ${ws._socket.remoteAddress}:${ws._socket.remotePort} #clients=${wss.clients.size}`);
    ws.on('close', req => {console.log(`disconnected, ws.id=${ws.id}, ${ws._socket.remoteAddress}:${ws._socket.remotePort} #clients=${wss.clients.size}`);});
...