RxJava:观察从套接字发出的消息

时间:2015-12-13 18:16:06

标签: java sockets reactive-programming rx-java

我还在努力学习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()Here's an example),但我认为这也不是正确的解决方案。通过套接字推送的消息不完整,因为它们具有最大长度。我需要自己“构建”消息,所以我需要在套接字的每次推送之间进行缓冲。

换句话说,我正在寻找一种方法来自从套接字推送的数据构建消息,然后将它们推送到Observable 。我一直在寻找适当的方法来做到这一点,但我似乎找不到合适的解决方案。

1 个答案:

答案 0 :(得分:4)

具有完全可自定义行为的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