简体   繁体   English

套接字IO房间和名称列表

[英]Socket IO rooms and names list

I am trying to display a list of users and count the number of users within a chatroom in a MEAN Stack Application. 我试图显示用户列表并计算MEAN Stack应用程序中聊天室中的用户数。 Unfortunately, I've encountered a pretty serious problem. 不幸的是,我遇到了一个非常严重的问题。 The number of users resets each time a new user enters the chat room. 每次新用户进入聊天室时,用户数都会重置。 I would like the current members in a chatroom to persist even though a new user enters a room. 我希望即使新用户进入会议室,聊天室中的当前成员也能继续存在。

Here is the server side code: 这是服务器端代码:

io.on('connection', function(socket){


  var users = [];
  var username = '';
  var room = '';
  console.log('a user has connected');


  socket.on('join-room', function(data){
    socket.join(data.room);
    room = data.room;
  });


  socket.on('request-users', function(){
    socket.to(room).emit('users', {users: users});
    console.log(users);
  });

  socket.on('add-user', function(data){

      io.to(room).emit('add-user', {
        username: data.username
      });
      username = data.username;
      users.push(data.username);
  });


  socket.on('disconnect', function(data){
    console.log(username + ' has disconnected');
    users.splice(users.indexOf(username), 1);
    io.to(room).emit('remove-user', {username: username});
  });
});

Here is the angular controller using btford-socket.io: 这是使用btford-socket.io的角度控制器:

angular.module('chatApp').controller('chatController', ['$scope', 'Socket','$cookies', '$rootScope', '$stateParams', function($scope, Socket, $cookies, $rootScope, $stateParams){
  Socket.connect();

  $scope.room = $stateParams.room;



  Socket.emit('join-room', {room:$stateParams.room}); 
  console.log($stateParams.room);

  $scope.users = [];


  if($cookies.get('token') && $cookies.get('currentUser')){
    console.log($cookies.get('currentUser'));
    Socket.emit('add-user', {username: $rootScope.currentUser});
  } else {
    bootbox.alert('You need to sign in to chat');
  }



  Socket.emit('request-users', {});


  Socket.on('users', function(data){
    $scope.users = data.users;
  });


  Socket.on('add-user', function(data) {
    $scope.users.push(data.username);
    $scope.messages.push({username: data.username, message: 'has arrived'});
  });

  Socket.on('remove-user', function(data){
    $scope.users.splice($scope.users.indexOf(data.username),1);
    $scope.messages.push({username: data.username, message: 'has left the building'});
  });


  $scope.$on('$locationChangeStart', function(event){
    Socket.disconnect(true);
  })
}]);

And lastly the HTML: 最后是HTML:

<div class="col-md-2" id="user-list">
  <p>Number of connected users: {{users.length}}</p>
  <ul>
    <li ng-repeat="user in users track by $index">{{user}}</li>
  </ul>
  <div class="fixed"></div>
</div>

So I am pretty sure this is what is happening. 所以我很确定这是正在发生的事情。 Each user has its own socket connection but when a new user connects it broadcasts this message to everyone. 每个用户都有自己的套接字连接,但是当新用户连接时,它将向所有人广播此消息。 Meaning it will reset the variables for everyone. 这意味着它将为所有人重置变量。 Declare your variables that you need in the application outside the connection function. 在连接功能之外声明应用程序中所需的变量。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM