【问题标题】:AngularJS : socket.io destroy socketAngularJS:socket.io 销毁套接字
【发布时间】:2014-09-12 21:36:56
【问题描述】:

我正在使用一个节点 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})});
 };

}]);

注入:

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

    $scope.socket = newSocketFactory();

这是我的销毁处理程序:

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

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

当服务器在打开模式时关闭时,会发生 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 等,但这些都不起作用,而且我不喜欢即使在范围完全被破坏后套接字似乎仍然存在,即使我可以破解它以停止尝试连接。

谢谢

【问题讨论】:

    标签: node.js angularjs sockets socket.io


    【解决方案1】:

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

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

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

    【讨论】:

    • 您好,谢谢您的回复。我最近没有处理这个问题,也没有机会很快再处理它(这些功能已经投入生产了一段时间,而且似乎很稳定)。对我们来说工作正常的最终结果是将配置(发送到 io.connect)设置为 forceNew = true。从那里,我使用 var ioSocket = io.connect(URL+ ':' + PORT, options); 手动创建套接字var socket = socketFactory({ioSocket: ioSocket});从那里开始,当尝试断开连接时,我首先删除套接字上的所有侦听器,然后调用 socket.disconnect()。到目前为止,这对我们有用。
    • 谢谢,我们也使用强制重新连接和手动调用disconnect()。我希望 SocketIO 的人能做一个可靠的状态机之类的......
    猜你喜欢
    • 2023-04-09
    • 2017-03-18
    • 2021-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    相关资源
    最近更新 更多