我正在探索用于自学的其他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}`);
});
});
答案 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>