我正在使用节点socket.io服务器和基于角度的socket.io客户端(使用angular-socket.io),除了1个特定条件外它运行良好:我无法弄清楚如何完全破坏套接字当插座无法连接时,我完成了它。
工作流程如下:在给定页面上有一个用于打开模态的按钮,模式的打开将套接字工厂注入到模态控制器中,并与socket.io服务器建立连接。当套接字可以连接时,这一切都很有效。当模态关闭时,调用$ scope.destroy并且模态控制器中的处理程序尝试清理套接字。
此模式可以多次关闭和重新打开,也可以只重复一次。我多次创建/销毁套接字的过程可能是我的问题的一部分,这可能不是正确的范例,但是当模态关闭时,将无法与它进行交互,并且在该页面被保留后,套接字肯定不会#39; t需要存在或保持连接。
插槽创建:
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等,但这些都没有用,并且我不喜欢套接字似乎仍然存在,即使在范围完全被破坏后,即使我可以破解它以停止尝试连接
由于
答案 0 :(得分:1)
当我处理类似的问题时,我得出的结论是SocketIO有一个凌乱的状态管理,至少可以说......所以我尝试创建自己的重新连接逻辑,例如在断开连接或错误时禁用重新连接,并且只在我需要时才重新连接。
我还考虑将原生SocketIO与状态处理程序(如(stuff) => $timeout(() => myHandler(stuff))
)一起使用,并在其周围放置单个角度服务。这样你的头脑就会对关闭模态,丢失范围等感到痛苦。
另外请发送您的结果,我非常感兴趣您从此经历过的经历。