代码之家  ›  专栏  ›  技术社区  ›  klode

Angular socket io:如何断开客户端

  •  1
  • klode  · 技术社区  · 11 年前

    使现代化

    现在,方法 socket.disconnect(close) has been included in angular-socket-io 。它具有布尔参数“close”,如果为true,则还会关闭基础连接。


    我正在使用btford/angular socket io

    断开客户端连接的正确方法是什么?

    我正在尝试实现以下场景

    1. 用户登录-->连接到插座
    2. 用户注销-->从插座断开
    3. 重复(1)(2)

    我成功实现了连接(1),但断开连接(2)时遇到了问题

    这是我尝试过的:在我的身份验证服务中,我有以下功能

    factory('AuthenticationService', function(socketFactory) {
      var mySocket;
      var service = {
          //...
          login: function(credentials) {
              var login = $http.post('/login', credentials);
              return login.then(function(response) {
                service.currentUser = response.data.user;
                if ( service.isAuthenticated() ) {
                    // **connect to socket on login** 
                    mySocket = socketFactory({ioSocket: io.connect('http://localhost')}); 
                }
                return service.isAuthenticated();
              });       
          },
    
          logout: function(redirectTo) {
              var logout = $http.get('/logout');
              logout.success(function() {
                service.currentUser = null;
                mySocket.disconnect();       // **disconnect on logout (not working)**
                redirect(redirectTo);
              });
              return logout;
          },
          //...
      };
      return service;
    })
    

    mySocket.disconnect();
    给出以下错误 TypeError:对象#没有方法“disconnect”

    mySocket.disconnect()在

    mySocket = socketFactory({ioSocket: io.connect('http://localhost')});
    

    我使用

    mySocket = io.connect('http://localhost'); 
    
    4 回复  |  直到 10 年前
        1
  •  1
  •   wayne    11 年前

    您的代码看起来正确。我认为问题是可变吊装,我的Socket是吊装。 阅读 here

        2
  •  1
  •   klode    11 年前

    我的理解是 btford/angular-socket-io 将套接字实例包装在socketFactory中 但不公开disconnet()方法 因此它不能用于从客户端断开套接字。

        3
  •  0
  •   Damien Roelens    11 年前

    事实上,解决方案非常简单:

    从Btford angular socket模块编辑“socket.js”文件,您将看到:

    var wrappedSocket = {
    
              on: addListener,
    
              addListener: addListener,
    
    
    
              emit: function (eventName, data, callback) {
    
                return socket.emit(eventName, data, asyncAngularify(socket, callback));
    
              },    
    
    
              removeListener: function () {
    
                return socket.removeListener.apply(socket, arguments);
    
              },
    
    
    
              // when socket.on('someEvent', fn (data) { ... }),
    
              // call scope.$broadcast('someEvent', data)
    
              forward: function (events, scope) {
    
                if (events instanceof Array === false) {
    
                  events = [events];
    
                }
    
                if (!scope) {
    
                  scope = defaultScope;
    
                }
    
                events.forEach(function (eventName) {
    
                  var prefixedEvent = prefix + eventName;
    
                  var forwardBroadcast = asyncAngularify(socket, function (data) {
    
                    scope.$broadcast(prefixedEvent, data);
    
                  });
    
                  scope.$on('$destroy', function () {
    
                    socket.removeListener(eventName, forwardBroadcast);
    
                  });
    
                  socket.on(eventName, forwardBroadcast);
    
                });
    
              }
    
            };
    

    然后您只需将此添加到其他函数旁边:

    disconnect: function(){
    
                    return socket.disconnect();
    
                  },
    

    瞧,你来了:)

    你应该有这样的东西:

    var wrappedSocket = {
    
              on: addListener,
    
              addListener: addListener,
    
    
    
              emit: function (eventName, data, callback) {
    
                return socket.emit(eventName, data, asyncAngularify(socket, callback));
    
              },
    
    
    
              disconnect: function(){
    
                return socket.disconnect();
    
              },
    
    
    
              removeListener: function () {
    
                return socket.removeListener.apply(socket, arguments);
    
              },
    
    
    
              // when socket.on('someEvent', fn (data) { ... }),
    
              // call scope.$broadcast('someEvent', data)
    
              forward: function (events, scope) {
    
                if (events instanceof Array === false) {
    
                  events = [events];
    
                }
    
                if (!scope) {
    
                  scope = defaultScope;
    
                }
    
                events.forEach(function (eventName) {
    
                  var prefixedEvent = prefix + eventName;
    
                  var forwardBroadcast = asyncAngularify(socket, function (data) {
    
                    scope.$broadcast(prefixedEvent, data);
    
                  });
    
                  scope.$on('$destroy', function () {
    
                    socket.removeListener(eventName, forwardBroadcast);
    
                  });
    
                  socket.on(eventName, forwardBroadcast);
    
                });
    
              }
    
            };
    
        4
  •  0
  •   justCurious    3 年前

    只需调用RsocketClient.close()方法。 enter image description here