簡體   English   中英

RxJava:觀察從套接字發出的消息

[英]RxJava: Observing messages emitted from a socket

我還在努力學習RxJava。 有一件事我現在無法繞過頭腦。 每一篇試圖了解我如何使用Rx的文章都向我展示了如何基於已經“可預測”的源創建Observable,即一組項目的序列(單個值,或者,例如,一個簡單的Iterable) 。

大多數情況下,你會看到Observable.just()

Observable<String> observerable = Observable.just("Hello, world!");

或者Observable.from()

Observable.from("apple", "orange", "banana").subscribe(fruit -> System.out.println(fruit));

這一切都很好,但是下面的用例呢?

我有不斷通過套接字推送的消息(我沒有構建它,我只是集成)。 我需要“觀察”通過套接字推送的數據序列。

許多人似乎都指向Obserable.using()這是一個例子 ),但我認為這也不是正確的解決方案。 通過套接字推送的消息不完整,因為它們具有最大長度。 我需要自己“構建”消息,因此我需要在每次從套接字推送之間進行緩沖。

換句話說, 我正在尋找一種方法來自從套接字推送的數據構建消息,然后將它們推入Observable 我一直在尋找適當的方法來做到這一點,但我似乎找不到合適的解決方案。

具有完全可定制行為的Observable怎么樣?

Observable.create(subscriber -> {
  Socket socket = getSocket();
  socket.subscribe(new SocketListener() {

    @Override public void onNewFrame(Frame frame) {
      // Process frame and prepare payload to the subscriber.

      if (payloadReadyForExternalObserver) {
        if (subscriber.isUnsubscribed()) {
          // Subscriber unsubscribed, let's close the socket.
          socket.close();
        } else {
          subscriber.onNext(payload);
        }
      }
    }

    @Override public void onSocketError(IOException exception) {
      subscriber.onError(exception); // Terminal state.
    }

    @Override public void onSocketClosed() {
      subscriber.onCompleted(); // Terminal state.
    }
  });
})

但請確保正確實施Observable合約,有關詳細信息,請閱讀https://github.com/ReactiveX/RxJava/wiki/Implementing-Your-Own-Operators

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM