webSocketServer node.js如何区分客户端

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

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发送一条消息到服务器,我发送一个通知给user2打开他的套接字。

您可以简单地将用户标识分配给数组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); } } 

在Worlize服务器中的这段代码真的帮了我很多。 即使你正在使用ws,代码应该很容易适应。 我在这里select了重要的部分:

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

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

希望有所帮助。

这取决于你正在使用的websocket。 例如,最快的一个,在这里find: 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)发送给一个特定的用户,然后你可以做user [userName] .send(message);

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

 var clientID = ws._socket._handle.fd; 

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

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

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

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

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

通过客户端,如果你的意思是打开的连接,那么你可以使用ws.upgradeReq.headers['sec-websocket-key']作为标识符。 并将所有套接字对象保存在一个数组中。

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

一个可能的解决scheme可能是在用户ID之前附加deviceId,所以我们可以用不同的设备分隔具有相同用户ID的多个用户。

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