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