我如何向ws库中的特定用户发送消息?

时间:2018-07-13 02:03:28

标签: node.js websocket socket.io

我正在探索用于自学的其他websocket库,我发现该库确实很棒ws-node。我正在ws-node库中建立基本的一对一聊天

我的问题是socket.io函数等效于ws中的socket.to().emit()吗?因为我想向特定用户发送消息。

前端-socket.io

socket.emit("message", { message: "my name is dragon", userID: "123"});

服务器端-socket.io

// listening on Message sent by users
socket.on("message", (data) => {
    // Send to a specific user for 1 on 1 chat
    socket.to(data.userID).emit(data.message);
});

WS-后端

const express = require('express');
const http =  require('http');
const WebSocket = require('ws');
const express = require('express');
const http =  require('http');
const WebSocket = require('ws');

const app = express();

const server = http.createServer(app);

const wss = new WebSocket.Server({ server });
wss.on('connection', (ws) => {

    ws.on('message', (data) => {   
        \\ I can't give it a extra parameter so that I can listen on the client side, and how do I send to a specific user?
        ws.send(`Hello, you sent -> ${data.message}`);
    });
});

2 个答案:

答案 0 :(得分:0)

没有等效的方法。 socket.io带有许多帮助程序和功能,可让您的生活更加轻松,例如房间,活动...

socket.io是一个实时应用程序框架,而ws只是一个WebSocket客户端。


您将需要进行自定义包装:

const sockets = {};

function to(user, data) {

    if(sockets[user] && sockets[user].readyState === WebSocket.OPEN)
        sockets[user].send(data);
}

wss.on('connection', (ws) => {

    const userId = getUserIdSomehow(ws);
    sockets[userId] = ws;

    ws.on('message', function incoming(message) {
        // Or get user in here
    });

    ws.on('close', function incoming(message) {
        delete sockets[userId];
    });

});

然后像这样使用它:

to('userId', 'some data');

我认为,如果您要使用该功能,则应使用socket.io。它易于集成,具有很多支持并具有用于多种语言的客户端库。

如果前端使用socket.io,则也必须在服务器上使用它。

答案 1 :(得分:0)

老实说,最好的方法是使用发布/订阅服务来抽象化WebSocket。

客户端<=(服务器)=>使用WebSockets进行客户端通信的问题是,客户端连接特定于“拥有”该连接的进程(和机器)。

当您的应用程序扩展到单个进程之外时(即由于水平缩放要求),WebSocket“集合”充其量将变得无关紧要。存储所有WebSocket连接的数组/字典现在仅存储一些连接。

正确的方法是使用use a pub/sub approach,也许使用与Redis类似的方法。

这允许每个用户“订阅”专用的“频道”(或“主题”)。用户可以订阅多个“渠道”(例如,一个全局通知渠道)。

要发送私人消息,另一个用户“发布”到该私人“频道”-就是这样。

发布/订阅服务将消息从“通道”路由到正确的订阅者-即使他们不共享同一进程或同一台计算机。

这允许连接到您在德国的服务器的客户端向发送到您在俄勒冈州(美国)的服务器的客户端发送私人消息,而无需担心“拥有”该连接的服务器/进程的身份。 / p>