Angular2 - 如何关闭 WebSocketSubject 底层套接字

Posted

技术标签:

【中文标题】Angular2 - 如何关闭 WebSocketSubject 底层套接字【英文标题】:Angular2 - How to close WebSocketSubject underlying socket 【发布时间】:2017-11-17 17:43:33 【问题描述】:

有没有办法获取WebSocketSubject订阅的socket?

当某种情况发生时,我需要关闭底层套接字。

我尝试通过 complete() 关闭它,但它没有关闭套接字。退订的也不行。

有人可以帮我吗?或者指出我正确的方向?

【问题讨论】:

【参考方案1】:

他说取消订阅不起作用。确实我有同样的问题。我正在取消订阅,它没有关闭。

我最终直接使用 websocket 而不是 WebSocketSubject,所以我可以调用方法 close(它有效)。

         this._ws = new WebSocket(this.url);
         this.messages = Observable.create((observer) => 
             this._ws.addEventListener('message', (message) => (
                // Et on ajoute chaque message dans l'Observable
                observer.next(message)
              ), false);

              // On s'enregistre au erreurs qui surviendraient
              // dans la websocket
              this._ws.addEventListener('error', (error) => 
                // Si un erreur est survenue, on prévient
                // l'Observable
                console.log('error ws');

                observer.error(error)

              , false);

              // On s'enregistre à la fermeture du websocket
              this._ws.addEventListener('close', () => 
                // On met fin à l'Observable
                observer.complete()

                console.log('complete');
              , false)
         )
    ... 

    public close() 
        console.log('on closing WS');
        this._ws.close()
    

我关注这个教程Introduction à RxJS和this one

如果您在服务器关闭 WS 后设法重新连接,请同时发布。

谢谢

【讨论】:

我找到了一种重新连接并知道服务器是否死机的方法。在几天前我问自己的另一个问题中,我让你回答了。 ***.com/a/49316097/1966439【参考方案2】:

为了获得正确的套接字断开连接,您应该取消订阅 websocketsubject 本身,而不是订阅:https://github.com/ReactiveX/rxjs/blob/master/src/internal/observable/dom/WebSocketSubject.ts#L295

【讨论】:

【参考方案3】:

更准确的方法是在WebSocketSubject 上致电complete()。但还有另一种解决方案。您可以使用这样的代码获取套接字。这很糟糕,但也可以。

var wrapper: any = subject;
wrapper._socket.close();

【讨论】:

【参考方案4】:

您可以直接在取消订阅所有观察者的WebSocketSubject 实例上调用unsubscribe()

const subject = Observable.webSocket(...);

...

subject.unsubscribe();

查看源码:https://github.com/ReactiveX/rxjs/blob/master/src/observable/dom/WebSocketSubject.ts#L269

【讨论】:

以上是关于Angular2 - 如何关闭 WebSocketSubject 底层套接字的主要内容,如果未能解决你的问题,请参考以下文章

angular2项目在firefox上加载时websocket中断

Angular2 - 如何关闭 WebSocketSubject 底层套接字

为啥我的 Angular 2 应用程序中的 Web 套接字已关闭,尽管我还没有明确关闭它?

如何正确关闭 websocket

关闭连接后如何重新连接到websocket [重复]

Java WebSocket:如何在不编写客户端的情况下测试服务器 WebSocket 端点 [关闭]