如何closuresAngular 2/4 +和Socket.io中的websocket

我试图创build一个使用websockets的应用程序,但是遇到了可怕的“多重连接”问题,每次页面重新加载而不是closures并重新打开一个新的websocket,另一个连接只是添加到列表中。 我的问题是,如果有人知道从Angular 2/4 +closuresSocket.io websocket的最佳/正确的方式。

至于代码,这是我所拥有的:

service.ts

getUserSocket(userID: string): Observable<any> { return new Observable(_Observer => { // Setup the socket namespace subscription this.UserSocket = io(NTC_API_URL + `/user/${userID}`, { secure: true }); this.UserSocket.on('message', _Message => { console.log(_Message); }) }) } closeUserSocket() { this.UserSocket.disconnect(); this.UserSocket.close(); } 

component.ts

 ngOninit() { // Setup the User Socket this.UserSocket = this._UsersService.getUserSocket(this.currentUser.userID) .subscribe(_UserSocketMessage => { console.log(_UserSocketMessage); }) } ngOnDestroy() { this.UserSocket.unsubscribe(); this._UsersService.closeUserSocket(); } 

这似乎没有工作,因为我仍然可以看到连接堆积起来,只是通过login我已经确认的应用程序中调用要被销毁的组件。

我试过的另一个select是使用once监听器,而不是监听器,它的工作,但我不确定的副作用,并已阅读了几个地方,它不一定是不closures连接,我可以理解的修复。

经过相当多的修补和研究后,我发现networkingsockets是有弹性的。 换句话说,由于他们被devise成尽可能地重新连接,所以关注disconnectclose是错误的方法。 在创build web套接字连接方面执行策略要容易得多。

对于初学者,我不得不在服务器端重构一些东西,以确保特定的命名空间只被初始化一次。 这不是通过改变初始化代码,而是通过确保web套接字初始化仅发生在仅仅在启动时发生的地方,或者在只有一次很可能发生的过程中发生,比如创build特定用户。

在angular度方面,这也是非常简单的,我只需要将套接字分配给服务中的一个属性,然后在进行套接字连接之前检查它是否存在。 因此,如果以前不存在连接,则只创build连接。

service.ts

 // Setup the socket namespace subscription if (!this.UserSocket) { // Initialize user permissions socket this.UserSocket = io(NTC_API_URL + `/user/${this.LocalUser.userID}`, { secure: true }); }