2014-09-12 62 views
5

我正在使用节点套接字服务器和一个基于角度的套接字.io客户端(使用angular-socket.io),它除了在一个特定的条件下运作良好:我不知道如何完全当套接字无法连接时完成套接字时会销毁套接字。AngularJS:socket.io破坏套接字

工作流程是这样的:在给定的页面上有一个按钮来打开一个模式,模式的打开将插座工厂注入到模块控制器中,并且连接到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. 
}); 

这正常工作时,该插座能够连接模式为前关闭时,服务器中断开连接的事件观察到客户端已断开连接。另外,我可以关闭模​​式,然后关闭服务器并且不会尝试重新连接。

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

这可能是一个angular-socket.io问题或一个普通的socket.io客户端问题。我在github上询问了angular-socket.io,但没有回应如何正确处理没有响应的angular-socket.io客户端套接字。我的问题是这样的:A)如果我没有用socket.io做一个主要的假人,我该如何安全地处理这个客户端套接字和B)如果我这样做是错误的,什么是更好的方法去管理一个不应该在页面间持续存在的websocket。

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

感谢

回答

1

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

我也考虑使用原生的SocketIO和状态处理程序,如(stuff) => $timeout(() => myHandler(stuff)),并在其周围放置一个单独的角度服务。这样,你的头就不会为关闭模态,失去示波器等而痛苦。

也请发送你的结果,我很感兴趣,你从那时起经历过的。

+1

嘿,谢谢你的回复。我最近没有做过这方面的工作,很快就没有机会再次开展工作(这些功能已经推出了一段时间,似乎很稳定)。 对我们来说工作正常的最终结果是将配置(发送到io.connect)设置为forceNew = true。从那里,我手动创建套接字与 var ioSocket = io.connect(URL +':'+ PORT,options); var socket = socketFactory({ioSocket:ioSocket}); 从那里,当试图断开连接时,我首先删除套接字上的所有侦听器,然后调用socket.disconnect()。到目前为止,这对我们很有效。 – 2015-07-20 18:31:41

+0

谢谢,我们使用强制重新连接并手动调用disconnect()。我希望SocketIO家伙能够制造一个可靠的状态机或其他... – 2015-07-20 23:26:28