如何向同一用户发出事件,该事件在不同的选项卡或 socket.io 浏览器中打开

How to emit event to same user which is opened in different tabs or browser in socket.io?

本文关键字:选项 socket 浏览器 io 用户 出事件 事件      更新时间:2023-09-26

我发现通过创建房间可以执行。但有些地方出了问题。

服务器端:-

var app = require('express')();
var http = require('http').Server(app);
var io   =  require('socket.io')(http);
var users = {};
var rooms = [];

http.listen(3000, function(){
  console.log('listening on *:3000');
});
io.on('connection', function(socket){
 socket.on('Init', function(data){
  if(data in users){
   var roomName = 'room'+ data;
   var index = rooms.indexof(roomName);
   if(rooms.notContain(roomName)){
    rooms.push(roomName);
   var index = rooms.indexof(roomName);
    users[data].join(rooms[index]);
    socket.join(rooms[index]);
   }else{
    socket.join(rooms[index]);
   }
  }else{
   socket.username = data;
   users[socket.username] = socket;
  }
  var indo = rooms.indexof('room'+ data);
  socket.in(rooms[indo]).emit('hai', data);
 });
});
Array.prototype.indexof = function(Obj){
 return this.indexOf(Obj);
}
Array.prototype.notContain = function(Obj){
 for(i in this){
  if(this[i] === Obj) return false;
 }
 return true;
}

客户端:-

var socket = io.connect('http://localhost:3000', { 'forceNew': true});
var userId = '<?php echo $_GET['userId'] ?>';
socket.on('connect', function(){
 socket.emit('Init', userId);
});
socket.on('hai', function(data){
 alert(data);
});

请检查这一点或让我找到任何其他解决方案来解决此问题。我希望同一个用户发出在不同的浏览器或选项卡中打开的内容。

我猜您正在尝试向同一用户的所有连接发送消息。这是一种方法:

var user_sockets = {};
io.on('connection', function(socket){
 socket.on('Init', function(data){
  if (typeof user_sockets[data] === 'undefined') {
    user_sockets[data] = [];
  }
  user_sockets[data].push(socket);
  for (var i = 0; i < user_sockets[data].length; i++) {
    var s = user_sockets[data][i];
    s.emit('hai', data);
  }
 });
});