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

Javascript 如何向在socket.io的不同选项卡或浏览器中打开的同一用户发送事件?,javascript,node.js,express,socket.io,Javascript,Node.js,Express,Socket.io,我发现,通过创建房间,它可以执行……但有些地方出了问题 服务器端:- 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'); }

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

服务器端:-

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 socket=io.connect('http://localhost:3000“,{'forceNew':true});
var userId='';
socket.on('connect',function(){
emit('Init',userId);
});
socket.on('hai',函数(数据){
警报(数据);
});

请检查此项或为我提供解决此问题的任何其他解决方案。我希望同一用户发出在不同浏览器或选项卡中打开的消息。

我猜您正在尝试向属于同一用户的所有连接发送消息。有一种方法可以做到这一点:

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);
  }
 });
});
var user_sockets={};
io.on('连接',函数(套接字){
socket.on('Init',函数(数据){
if(用户类型_套接字[数据]==‘未定义’){
用户_套接字[数据]=[];
}
用户\u套接字[数据]。推送(套接字);
对于(var i=0;i
感谢您的重播……我有一些疑问……首先,我将在上面澄清我的要求,它可能会发送到数据阵列中的所有套接字!但是我怎样才能检测到用户呢?插座是否属于同一用户?考虑一个用户和A已经登录到聊天应用程序,并且同样的A在另一个标签或浏览器中打开帐户,所以我必须将所有事件发送到A,并且它必须在所有标签和浏览器中接收,其中A已经登录。我发现很多文章说,say的房间可以通过将所有与用户A相关的插座插入房间并向该房间发出事件来纠正为单个用户创建多个连接和插座的问题。希望你能理解这个问题。非常感谢您的回复,我也感谢您的帮助。agin提前感谢您今后协助纠正此问题。:)您的解决方案有什么问题?程序有什么问题?你想达到什么目标?