为节点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.onio.emit 方法进行请求和响应。目前我面临的问题是我得到了所有用户的响应。 我只想通知特定用户。但是当我在 *** 上提出上述问题时,有人让我关注 this 链接。但是在上面的链接中,提到,我们需要一个用户 ID,当用户登录我们的应用程序时我可以得到它。请查看我的 server.jsrouter.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中的特定用户发出事件的主要内容,如果未能解决你的问题,请参考以下文章

如何在socket.io中向特定用户发送消息?

Nest.js 中的 Socket.io 确认

节点 Js 无法将消息发送到在线特定套接字

节点 Js 无法将消息发送到在线特定套接字

js节点-socket.io聊天修改

如何使用nodejs socket.io向特定房间中的用户发送打字警报和消息