【发布时间】: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