Javascript 在节点js的Socket.io中为特定用户发出事件
我使用了方法Javascript 在节点js的Socket.io中为特定用户发出事件,javascript,node.js,sockets,socket.io,Javascript,Node.js,Sockets,Socket.io,我使用了方法socket.on和io.emit分别用于请求和响应。目前我面临的问题是我得到了所有用户的响应。 我只想通知特定用户。但当我在stackoverflow上问上述问题时,有人让我跟随链接。但在上面的链接中提到,我们需要一个用户Id,当用户登录到我们的应用程序时,我可以得到这个Id。请查看我的server.js和router.js文件代码 router.js const express = require('express'); const router = express.Router
socket.on
和io.emit
分别用于请求和响应。目前我面临的问题是我得到了所有用户的响应。
我只想通知特定用户。但当我在stackoverflow上问上述问题时,有人让我跟随链接。但在上面的链接中提到,我们需要一个用户Id,当用户登录到我们的应用程序时,我可以得到这个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;
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(`Try something like this
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);
});
});
server.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;
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(`Try something like this
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);
});
});
const express=require('express');
const router=require('./路由器');
const bodyParser=require('body-parser');
常量app=express();
use(bodyParser.json());
var server=require('http')。服务器(应用程序);
var io=require('socket.io')(服务器);
服务器。侦听(端口,()=>{
log(`试试这样的方法
socket.to(sockets[data.user]).emit("personal", data);
在send_personal_message(发送个人消息)中,您将从数据对象中的发件人处接收用户名。以下代码将帮助您向选定用户发送消息
[https://socket.io/docs/emit-cheatsheet/][1]
io.on('connect',onConnect)
函数onConnect(套接字){
//发送到客户端
emit('hello','you couldn me?',1,2,'abc')
//发送到除发件人以外的所有客户端
socket.broadcast.emit('broadcast','hellofriends!')
//发送至“游戏”室中的所有客户端(发件人除外)
socket.to('game').emit('nice game','let's play a game')
//发送到“game1”和/或“game2”房间中的所有客户端,发件人除外
socket.to('game1')。to('game2')。emit('nice game',“让我们也玩一个游戏吧”)
//发送到“游戏”室中的所有客户端,包括发件人
io.in('game').emit('big-announcement','游戏即将开始')
//正在发送到命名空间“myNamespace”中的所有客户端,包括发件人
io.of('myNamespace').emit('biger-announcement','比赛即将开始')
//发送到特定命名空间中的特定房间,包括发件人
io.of('myNamespace')。to('room')。emit('event','message')
//发送到单个socketid(私人消息)
io.to(${socketId}
).emit('hey','I just meet you')
//警告:socket.to(socket.id).emit()
将无法工作,因为它将发送给房间中的每个人
//名为socket.id
但为发件人。请改用经典的socket.emit()
//确认发送
emit('question','doyouthink?',function(answer){})
//无压缩发送
socket.compress(false).emit('uncompressed','that's rough')
//发送一条在客户端未准备好接收消息时可能被删除的消息
socket.volatile.emit('maybe','您真的需要它吗?')
//指定要发送的数据是否包含二进制数据
socket.binary(false).emit('what','I没有二进制文件!')
//发送到此节点上的所有客户端(使用多个节点时)
io.local.emit(‘嗨’、‘我可爱的宝贝’)
//发送到所有连接的客户端
io.emit(“发送到所有连接客户端的事件”)
})
这是一个socket io emit备忘单。一种方法是通过用户唯一id创建一个文件室并加入该文件室。因此,每当您向该文件室发送某些内容时,该特定用户将获得该消息。创建文件室更为简单,所以后面的部分您只需检查该文件室中的用户在线、离线和其他工作。此概念适用于一个用户和多个用户我也想知道同样的情况。