AngularJS:socket.io销毁套接字

Luk*_*ice 5 sockets node.js socket.io angularjs

我正在使用一个节点socket.io服务器和一个基于角度的socket.io客户端(使用angular-socket.io),除了在1个特定条件下它运行良好:我无法弄清楚当我是如何彻底销毁套接字当套接字无法连接时完成它.

工作流是这样的:在给定页面上有一个用于打开模态的按钮,模态的打开将套接字工厂注入到模态控制器中,并且连接到socket.io服务器.当套接字可以连接时,这一切都很有效.当模态关闭时,调用$ scope.destroy并且模态控制器中的处理程序尝试清理套接字.

此模式可以多次关闭和重新打开,也可以只重复一次.我多次创建/销毁套接字的过程可能是我的问题的一部分,这可能不是正确的范例,但是当模态关闭时,将无法与它进行交互,并且在该页面被保留后,套接字肯定不会不需要存在或保持联系.

套接字创建:

angular.module('app.common.newSocketFactory', ['btford.socket-io'])
.factory('newSocketFactory', ['socketFactory', function(socketFactory){

 return function(){
   return socketFactory({ioSocket:io.connect('http://localhost:3000', {forceNew: true})});
 };

}]);
Run Code Online (Sandbox Code Playgroud)

注射:

angular.module('...', [
  'app.common.newSocketFactory',
  ....
])
.controller('Controller', ['$scope', '$modalInstance', 'newSocketFactory', ...
  function ($scope, $modalInstance, newSocketFactory, ...){
    ...

    $scope.socket = newSocketFactory();
Run Code Online (Sandbox Code Playgroud)

这是我的销毁处理程序:

$scope.$on('$destroy', function(){
  $scope.socket.emit('unlisten');
  $scope.socket.disconnect();  //have tried passing true too.
});
Run Code Online (Sandbox Code Playgroud)

当模块关闭之前套接字能够连接时,这可以正常工作,服务器中的断开事件观察到客户端断开连接.此外,我可以关闭模​​式,然后关闭服务器并且不会尝试重新连接.

打开模式时关闭服务器时,会发生TransportErrors并重新尝试连接.如果我此时关闭模式,则错误会继续,如果我重新启动服务器,则重试成功,客户端将连接到服务器.最糟糕的部分是我使用这个套接字来维护对一块硬件的原子访问,硬件被第一个套接字锁定.除非我重新启动服务器,允许套接字连接,然后关闭模式(在我的隔离范围和socket.disconnect()上触发$ destroy),我必须刷新整个页面以销毁套接字.

这可能是angular-socket.io问题或常规的socket.io客户端问题.我在angular-socket.io的github上询问如何正确处理一个没有响应的angular-socket.io客户端套接字.

我的问题是这样的:A)如果我没有使用socket.io做一个重要的失败,我怎么能安全地处理这个客户端套接字而且B)如果我这样做错了,那么更好的方法是管理一个不应该在页面之间持续存在的websocket.

注意:angular-socket.io套接字只是用一些东西包装本机套接字以帮助处理角度范围.调用disconnect()时,结果看起来就像是底层套接字本身.我已经尝试将重新连接设置设置为false等,但没有一个工作,并且我不喜欢即使在范围完全被破坏后套接字似乎仍然存在,即使我可以破解它以停止尝试连接.

谢谢

Gáb*_*mre 1

当我处理类似的问题时,我得出的结论是 SocketIO 至少可以说有一个混乱的状态管理...所以我尝试创建自己的重新连接逻辑,例如在断开连接或错误时禁用重新连接,并且仅在需要时重新连接它到。

我还考虑使用带有状态处理程序的本机 SocketIO (stuff) => $timeout(() => myHandler(stuff)),并在其周围放置单例角度服务。这样你就不会因为关闭模态、丢失范围等而头痛。

另外请发送您的结果,我对您从那时起所经历的事情非常感兴趣。