Angular Websocket RxJS / WebSocketSubject

时间:2017-05-26 12:46:14

标签: angular websocket rxjs

在过去,我们使用了几个angular2 websocket impelmentations但我们对它们并不满意,使用它们有几个问题。所以我们决定用我们自己的RxJs来做我们的财富。

这是我们的第一次尝试:

var text = `fjskdfjslfjsl
skfjslfkjsldfjslfjs
jfsfkjslfsljs`;

套接字打开并且运行良好一段时间。几秒钟后,浏览器关闭了套接字,我在服务器端收到了关闭事件。

这是我们在服务器网站上获得的结果: [1006] WebSocket阅读EOF

有人可以提供帮助吗?或者有人知道如何使用WebSocketSubject吗?

1 个答案:

答案 0 :(得分:1)

我不知道它是否仍然相关但我确实使用类似于websocket连接的角度与https://github.com/ohjames/rxjs-websockets

我在组件中进行的一些修改,我调用ServerSocketService(用于连接到基于websocket的端点),即重试机制,我使用了ReplaySubject而不是示例中给出的QueuingSubject。

@Injectable()
export class ServerSocket {
    // private inputStream: QueueingSubject<string>;
    private inputStream: ReplaySubject<string>;
    public messages: Observable<string>;
    private subscription: Subscription;
    private websocket: WebSocket;

    public connect() {
        if (this.messages) {
            return;
        }
        console.log('inside connect');
        // this.inputStream = new QueueingSubject<string>();
        this.inputStream = new ReplaySubject();

        // Using share() causes a single websocket to be created when the first
        // observer subscribes. This socket is shared with subsequent observers
        // and closed when the observer count falls to zero.
        this.messages = websocketConnect(
            'ws://localhost:9097/echo',
            this.inputStream
        ).messages.share();


        this.messages.retryWhen(errors => errors.delay(1000)).subscribe(message => {
           console.log('error', message);
        });
    }

    public send(message: string): void {
        // If the websocket is not connected then the QueueingSubject will ensure
        // that messages are queued and delivered when the websocket reconnects.
        // A regular Subject can be used to discard messages sent when the websocket
        // is disconnected.

        this.inputStream.next(message);

    }
}

然后在组件的OnInit生命周期内部进行连接,订阅然后发送消息。一旦组件到达其OnDestroy生命周期,就可以通过取消订阅来释放资源。