2017-08-08 37 views
1

我正嘗試創建一個使用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://stackoverflow.com/a/31349392/5619416 –

+0

你確定嗎?我的intellisense尖叫着我,因爲disconnect()方法不帶任何參數。 – joshrathke

+0

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

回答

0

經過相當多的修補和研究後,我發現網絡套接字被製成具有彈性。換句話說,由於它們被設計爲在可能的情況下重新連接,因此重點在於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 }); 
}