为节点js中的Socket.io中的特定用户发出事件
Posted
技术标签:
【中文标题】为节点js中的Socket.io中的特定用户发出事件【英文标题】:Emit event for particular user in Socket.io in node js 【发布时间】:2019-06-07 17:31:45 【问题描述】:我分别使用socket.on
和io.emit
方法进行请求和响应。目前我面临的问题是我得到了所有用户的响应。
我只想通知特定用户。但是当我在 *** 上提出上述问题时,有人让我关注 this 链接。但是在上面的链接中,提到,我们需要一个用户 ID,当用户登录我们的应用程序时我可以得到它。请查看我的 server.js 和 router.js 文件代码。
router.js
const express = require('express');
const router = express.Router();
const passport = require('passport');
const userController = require('../controllers/user');
router.route('/auth/login')
.post(
userController.login
);
router.route('/users')
.get(
passport.authenticate('jwt', session: false ),
userController.getUsers
);
module.exports = router;
server.js
const express = require('express');
const router = require('./router');
const bodyParser = require('body-parser');
const app = express();
app.use(bodyParser.json());
var server = require('http').Server(app);
var io = require('socket.io')(server);
server.listen(PORT, () =>
console.log(`????\tListening on port $PORT!`);
);
app.io = io;
app.use('/api', router);
注意:现在谁能告诉我,如果我已经注册并登录到我的应用程序,如何为特定用户发出事件。
【问题讨论】:
我也想知道。 【参考方案1】:[https://socket.io/docs/emit-cheatsheet/][1]
io.on('connect', onConnect);
函数 onConnect(socket)
// 发送给客户端 socket.emit('hello', '你能听到我说话吗?', 1, 2, 'abc');
// 发送给除发件人以外的所有客户端 socket.broadcast.emit('广播', '朋友你好!');
// 发送到“游戏”房间中的所有客户端,发送者除外 socket.to('game').emit('nice game', "我们来玩个游戏吧");
// 发送到“game1”和/或“game2”房间中的所有客户端,发送者除外 socket.to('game1').to('game2').emit('nice game', "我们也玩个游戏吧");
// 发送给“游戏”房间内的所有客户端,包括发送者 io.in('game').emit('big-announcement', '游戏即将开始');
// 发送到命名空间 'myNamespace' 中的所有客户端,包括发送者 io.of('myNamespace').emit('bigger-announcement', '比赛即将开始');
//发送到特定命名空间中的特定房间,包括sender io.of('myNamespace').to('room').emit('event', 'message');
// 发送到单独的socketid(私人消息)
io.to($socketId
).emit('嘿', '我刚认识你');
// 警告:socket.to(socket.id).emit()
不起作用,因为它会发送给房间里的每个人
// 命名为 socket.id
但发送者。请改用经典的socket.emit()
。
// 发送确认 socket.emit('question', '你这么认为吗?', function (answer) );
// 不压缩发送 socket.compress(false).emit('uncompressed', "这很粗糙");
// 发送一条消息,如果客户端还没有准备好接收消息,该消息可能会被丢弃 socket.volatile.emit('也许', '你真的需要它吗?');
//指定要发送的数据是否有二进制数据 socket.binary(false).emit('what', '我没有二进制文件!');
// 发送到该节点上的所有客户端(当使用多个节点时) io.local.emit('hi', '我可爱的宝宝们');
// 发送到所有连接的客户端 io.emit('发送给所有连接客户端的事件');
;
这是一个 socket io emit-cheatsheet 。一种方法是通过用户唯一 ID 创建一个房间并加入它。所以每当你向那个房间发出一些东西时,那个特定的用户就会得到那个 msg 。创建 ROOM 更容易,所以后面部分您可以检查该 ROOM 以供用户在线离线和其他工作。这个概念适用于一个用户和多个用户组,如 watsapp 。
【讨论】:
【参考方案2】:试试这样的
let sockets = [];
io.on("connection", function(socket)
socket.on("online", data =>
socket.name = data.username;
sockets[data.username] = socket.id;
);
socket.on("message", function(data)
socket.broadcast.emit("public", data);
);
socket.on("send_personal_message", function(data)
socket.to(sockets[data.user]).emit("personal", data);
);
socket.on("disconnect", reason =>
sockets.splice(sockets.findIndex(id => id === socket.id), 1);
);
);
在 send_personal_message 中,您将在数据对象中从发件人那里收到用户名。以下代码将帮助您向选定的用户发送消息。
socket.to(sockets[data.user]).emit("personal", data);
【讨论】:
以上是关于为节点js中的Socket.io中的特定用户发出事件的主要内容,如果未能解决你的问题,请参考以下文章