webSocketServer node.js如何区分客户端

17 浏览
0 Comments

webSocketServer node.js如何区分客户端

我正在尝试在node.js中使用sockets,我成功了,但是我不知道如何在我的代码中区分不同的客户端。

与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中运行良好。

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

在我的情况下,我作为客户端发送一条消息,我收到一个响应,但其他用户什么也看不到。

例如,我希望用户1通过webSocket向服务器发送一条消息,然后我向打开他们的socket的用户2发送一个通知。

0
0 Comments

WebSocketServer是一个用于在Node.js中创建WebSocket服务器的库。在使用该库时,有时需要区分不同的客户端。下面介绍了一些解决方法。

首先,可以直接修改WebSocket客户端(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;
});

在获取所有客户端对象时,是否有一种方法可以获取到请求(request)的信息呢?可以使用`ws.clients.values()`方法,然后通过遍历获取请求对象。以下是一些相关讨论和参考链接:

+1 for the answer. Adding references supporting it: github.com/websockets/ws/issues/859

This is was awesome, thanks! I am using the websocket library (instead of ws) so I had to use `req.resourceURL` This includes a parsed querystring as part of the object so you can just `req.resourceURL.query.myCustomParam`

In TypeScript, I get a `Property 'id' does not exist on type 'WebSocket'` error. Is there a way to do this without casting to `any` as described here?

If any newbie is wondering, `url` at `url.parse()` is a built-in Nodejs module. In order to get this line to work add `const url = require('url')` to your script

0
0 Comments

WebSocket 是一种在客户端和服务器之间进行双向通信的协议。在使用 WebSocket 时,有时候需要对不同的客户端进行区分,以便进行针对性的操作。本文将探讨如何在 Node.js 的 WebSocket 服务器中区分不同的客户端。

在 Node.js 中,我们可以使用 `request` 头部的 `sec-websocket-key` 来区分不同的客户端。具体的做法是在 WebSocket 服务器的连接事件中添加如下代码:

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

上述代码中,`ws` 是 WebSocket 对象,而 `req` 则是连接请求的相关信息。通过获取 `request` 头部的 `sec-websocket-key` 值,我们可以将其赋值给 `ws` 对象的 `id` 属性,从而实现对客户端的区分。

然而,上述方法可能会遇到 `sec-websocket-key` 冲突的问题。当两个或多个客户端的 `sec-websocket-key` 值相同时,可能会导致客户端被错误地识别为同一个客户端。

那么,如何解决 `sec-websocket-key` 冲突的问题呢?幸运的是,我们可以使用其他的标识符或属性来进行客户端的区分。比如可以使用客户端的 IP 地址、端口号、或者自定义的唯一标识符来替代 `sec-websocket-key`。

总结起来,使用 `sec-websocket-key` 头部可以在 Node.js 的 WebSocket 服务器中区分不同的客户端。但是需要注意处理 `sec-websocket-key` 冲突的问题,可以通过使用其他标识符或属性来解决。

0
0 Comments

WebSocketServer是一个用于创建WebSocket服务器的Node.js库。在上述代码中,通过将用户的ID赋值给一个名为CLIENTS[]的数组来区分不同的客户端。每当有新的客户端连接到服务器时,将其WebSocket实例添加到CLIENTS数组中。当收到消息时,将该消息发送给所有的客户端。

然而,这种解决方案无法进行扩展,因为CLIENTS变量只存在于Node.js的一个进程中。即使通过fork多个进程来利用多个核心,每个进程也会维护自己的CLIENTS列表。因此,需要后续的连接与同一个进程通信。

在评论中,有人提出了如何在多个工作进程中共享WebSocket连接的问题。使用缓存系统(如Redis)只能存储连接的ID,而无法共享客户端的WebSocket实例。

另外,有人提出了如何获取客户端信息(如IP地址)的问题。可以使用Redis的发布-订阅功能,创建一个"publish"频道,每个服务器都监听该频道。当有消息发布到该频道时,每个服务器都会向它们的客户端广播消息。

对于如何将分配的ID发送回客户端的问题,这并不是本文讨论的范围,因为Stack Overflow不是提供全面解决方案的地方,而是提供简短的代码片段来帮助解决问题。

另外,有人指出这种解决方案最终会导致内存泄漏。这是因为在每次有新的客户端连接时,都会将其WebSocket实例添加到CLIENTS数组中,但不会在某个时刻将其移除,这将导致内存耗尽。

这个问题的出现是因为需要区分不同的客户端,并向它们发送消息。解决方法是使用一个数组来存储所有的客户端,并通过遍历数组来向每个客户端发送消息。然而,这种解决方案无法进行扩展,并且可能导致内存泄漏。在多个工作进程中共享WebSocket连接的问题可以使用缓存系统来解决,但无法共享客户端的WebSocket实例。

0