如何关闭Angular 2/4 +和Socket.io中的websocket

问题描述:

我正尝试创建一个使用websockets的应用程序,但我正在运行可怕的“多重连接”问题,每次页面重新加载而不是关闭时重新打开一个新的websocket,另一个连接只是简单地添加到列表中。我的问题是,如果有人知道从Angular 2/4 +关闭Socket.io websocket的最佳方式。如何关闭Angular 2/4 +和Socket.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(); 
} 

这似乎并不奏效的我仍然可以通过登录已确认电话的应用程序来观看连接是要销毁的组件。

另一种选择我试图用的是once听众,而不是on监听器,它可以工作,但我不确定的副作用,并已看过一些地方,它不是一定是不关闭的连接,我可以修复理解。

+0

的'.disconnect'方法应与一个布尔值指示是否要关闭底层连接被调用。所以你应该尝试调用'.disconnect(true)'。参考:https://*.com/a/31349392/5619416 –

+0

你确定吗?我的intellisense尖叫着我,因为disconnect()方法不带任何参数。 – joshrathke

+0

啊,我想你是参考一个'server'方法而不是'client'方法。客户端正在Angular上使用。 – joshrathke

经过相当多的修补和研究后,我发现网络套接字被制成具有弹性。换句话说,由于它们被设计为在可能的情况下重新连接,因此重点在于disconnectclose是错误的方法。执行关于网络套接字连接的创建的策略要容易得多。对于初学者,我不得不在服务器端重构一些东西,以确保特定的名称空间只被初始化一次。这不是通过改变初始化代码来实现的,因为它通过确保Web套接字初始化仅发生在仅在启动时发生的地方或者仅在创建特定用户之后很可能发生的进程期间发生。

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

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 }); 
}