Socket.io不会发出消息房间的discconect [英] Socket.io Won't Emit messages to rooms on discconect

查看:178
本文介绍了Socket.io不会发出消息房间的discconect的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

基本上我试图创建使用Node.js的和快速的聊天室棱角分明。

我用其他插座的事件和他们的工作我不太明白为什么他们不希望现在的工作。真正奇怪的是,登录工作正常,相当不错,但是当涉及到​​注销,甚至用我的断法,什么也没有发生在服务器端,使用断开功能,控制台。日志工作正常。但它不会发出。

在角边我所有的的console.log s的运行还没有事件注销或discconecnting时点击服务器。

节点里面我有三个活动

  socket.on('聊天:用户登陆',功能(用户){
    socket.join('在线用户');
    聊天室[user.id =用户
    的console.log(用户已登录,聊天室载:,聊天室);
    io.sockets.in('在线用户')发射('聊天:usersOnline,聊天室)。
  })  socket.on('聊天:userLogout',功能(用户id){
    的console.log(用户编号+用户id +'被注销');
    删除聊天室[用户id]
    的console.log(用户已注销,聊天室载:,聊天室);
    io.sockets.in('在线用户')发射('聊天:userLeave,聊天室)。
    socket.leave('在线用户');
  })  socket.on('脱节',函数(){
    VAR userRoom =客房[socket.roomId]    如果(聊天室[socket.userId])
      删除聊天室[socket.userId]    io.sockets.in('在线用户')发射的('聊天:userLeave',socket.userId)。
    的console.log('发射用户所留下来:,io.sockets.in('在线用户'));
    socket.leave('在线用户');
  }

而在角我有两个函数发出这两个事件

  this.logout =功能(用户id){
      的console.log('记录用户的:,用户id);
      Socket.emit('聊天:userLogout',用户id);
      的console.log('已注销用户?');
      删除this.userStore [用户id]
    }    this.login =功能(用户id){
      的console.log('在线获取用户,用户id);
      VAR自我=这一点;
      User.get({ID:用户id},功能(用户){
        self.userStore [用户id] =用户;
        Socket.emit('聊天:用户登陆',用户);
      });
    }


解决方案

这可能会解决你的问题,但除非你想发送消息到所有插座在房间里,你应该使用socket.broadcast.to('ROOMNAME') (包括发送该消息中的一个)。所以,你的code看起来像

  socket.on('聊天:用户登陆',功能(用户){
   socket.join('在线用户');
   聊天室[user.id =用户
   的console.log(用户已登录,聊天室载:,聊天室);
   //发射到其他人,除了寄件人
   socket.broadcast.to('在线用户')发射('聊天:usersOnline,聊天室)。
})socket.on('聊天:userLogout',功能(用户id){
   的console.log(用户编号+用户id +'被注销');
   删除聊天室[用户id]
   socket.leave('在线用户');
   //离开聊天室在这里意味着我们能发射所有的人在房间里
   io.sockets.in('在线用户')发射('聊天:userLeave,聊天室)。
   的console.log(用户已注销,聊天室载:,聊天室);})socket.on('脱节',函数(){
   VAR userRoom =客房[socket.roomId]   如果(聊天室[socket.userId])
      删除聊天室[socket.userId]   socket.leave('在线用户');
   io.sockets.in('在线用户')发射的('聊天:userLeave',socket.userId)。   的console.log('发射用户所留下来:,io.sockets.in('在线用户'));
}

查看<一个href=\"http://stackoverflow.com/questions/6873607/socket-io-rooms-difference-between-broadcast-to-and-sockets-in\">this问题,获取更多信息。

Basically I'm trying to create a quick chat room using Node.JS and angular.

I've Used other socket events and they worked I don't quite get why they don't want to work now. The really weird thing is that The login works fine and quite well, but when It comes to the logout, or even using my disconnect method, Nothing happens on the server side, with the disconnect function, the console.log works fine. But It won't emit.

On the angular side all my console.logs are running yet no events hit the server when logging out or discconecnting.

Inside of Node I have Three Events

 socket.on('chat:userLogin', function(user) {
    socket.join('online-users');
    chatRoom[user.id] = user
    console.log('User Has logged in, chat room contains: ', chatRoom);
    io.sockets.in('online-users').emit('chat:usersOnline', chatRoom)
  })

  socket.on('chat:userLogout', function(userId) {
    console.log('User Id ' + userId + 'is logging out');
    delete chatRoom[userId]
    console.log('User Has logged out, chat room contains: ', chatRoom);
    io.sockets.in('online-users').emit('chat:userLeave', chatRoom);
    socket.leave('online-users');
  })

  socket.on('disconnect', function() {
    var userRoom = rooms[socket.roomId]

    if (chatRoom[socket.userId])
      delete chatRoom[socket.userId]

    io.sockets.in('online-users').emit('chat:userLeave', socket.userId);
    console.log('Emitting that users have left to: ', io.sockets.in('online-users'));
    socket.leave('online-users');
  }

And in angular I have a Two functions that emit these two events

  this.logout = function(userId) {
      console.log('Logging user out: ', userId);
      Socket.emit('chat:userLogout', userId);
      console.log('Logged out user?');
      delete this.userStore[userId]
    }

    this.login = function(userId) {
      console.log('Getting online user ', userId);
      var self = this;
      User.get({id: userId}, function(user) {
        self.userStore[userId] = user;
        Socket.emit('chat:userLogin', user);
      });
    }

解决方案

It may fix your issue but you should be using socket.broadcast.to('roomname') unless you want to send the message to all sockets in the room (including the one that sent the message). So your code would look something like

socket.on('chat:userLogin', function(user) {
   socket.join('online-users');
   chatRoom[user.id] = user
   console.log('User Has logged in, chat room contains: ', chatRoom);
   // emit to everyone else except the sender
   socket.broadcast.to('online-users').emit('chat:usersOnline', chatRoom);
})

socket.on('chat:userLogout', function(userId) {
   console.log('User Id ' + userId + 'is logging out');
   delete chatRoom[userId]
   socket.leave('online-users');
   // leaving the chat room here means we can emit to all people in the room
   io.sockets.in('online-users').emit('chat:userLeave', chatRoom);
   console.log('User Has logged out, chat room contains: ', chatRoom);

})

socket.on('disconnect', function() {
   var userRoom = rooms[socket.roomId]

   if (chatRoom[socket.userId])
      delete chatRoom[socket.userId]

   socket.leave('online-users');
   io.sockets.in('online-users').emit('chat:userLeave', socket.userId);

   console.log('Emitting that users have left to: ', io.sockets.in('online-users'));
}

Check out this question for more info.

这篇关于Socket.io不会发出消息房间的discconect的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆