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

RxJava:观察套接字发出的消息,java,sockets,reactive-programming,rx-java,Java,Sockets,Reactive Programming,Rx Java,我还在努力学习RxJava。有一件事我现在还不能理解。每一篇试图学习我如何使用Rx的文章都向我展示了如何基于已经“可预测”的源创建可观测值,即一组项目的序列(单个值或,例如,一个简单的Iterable) 大多数情况下,您会看到一些可以观察到的东西。just() 这很好,但是下面的用例呢 我有不断通过套接字推送的消息(我没有构建它,我只是在集成)。我需要“观察”通过套接字推送的数据序列 许多人似乎认为是可观察的。使用()(),但我认为这也不是正确的解决方案。通过套接字推送的消息不完整,因为它们具有

我还在努力学习RxJava。有一件事我现在还不能理解。每一篇试图学习我如何使用Rx的文章都向我展示了如何基于已经“可预测”的源创建可观测值,即一组项目的序列(单个值或,例如,一个简单的Iterable)

大多数情况下,您会看到一些可以观察到的东西。just()

这很好,但是下面的用例呢

我有不断通过套接字推送的消息(我没有构建它,我只是在集成)。我需要“观察”通过套接字推送的数据序列

许多人似乎认为
是可观察的。使用()
(),但我认为这也不是正确的解决方案。通过套接字推送的消息不完整,因为它们具有最大长度。我需要自己“框定”消息,所以我需要在套接字的每次推送之间进行缓冲


换句话说,我正在寻找一种方法,通过从套接字推送的数据来框显消息,然后将它们推送到可观察的。我一直在寻找合适的方法来实现这一点,但我似乎找不到合适的解决方案。

对于具有完全可定制行为的
可观察的

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.from("apple", "orange", "banana").subscribe(fruit -> System.out.println(fruit));
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.
    }
  });
})