Rx java RxJava从多个源接收数据包,并在每个数据包之间延迟写入OutputStream
我让Java TCP客户端套接字读取InputStream,并通过RxJava PublishSubject将数据包分发到应用程序的各个部分。这很有效 有时我也会写OutputStream。命令转换为单个数据包(字节[]),并推送到流中。为此,我使用Rx java RxJava从多个源接收数据包,并在每个数据包之间延迟写入OutputStream,rx-java,rx-java2,rx-java3,Rx Java,Rx Java2,Rx Java3,我让Java TCP客户端套接字读取InputStream,并通过RxJava PublishSubject将数据包分发到应用程序的各个部分。这很有效 有时我也会写OutputStream。命令转换为单个数据包(字节[]),并推送到流中。为此,我使用 public void writeToSocket(byte[] packet) { Completable.fromAction(() -> { outputStream.write(packet);
public void writeToSocket(byte[] packet) {
Completable.fromAction(() -> {
outputStream.write(packet);
outputStream.flush();
}).subscribeOn(Schedulers.io()).subscribe();
}
现在我要执行
outputStream.write(packet);
outputStream.flush();
以符合以下条件的方式
是否有任何方法可以使用RxJava实现这一点。提前谢谢 您可以使用序列化的
PublishSubject
收集字节,然后使用concatMapCompletable
执行写入,然后进行延迟:
var subject=PublishSubject.create().toSerialized();
主题
.concatMapCompletable(字节->
Completable.fromAction(()->{
outputStream.write(数据包);
outputStream.flush();
})
.subscribeOn(Schedulers.io())
.和(可完成计时器(50,时间单位毫秒))
)
.subscribe();
或者,如果您不介意在任何时候都将一个线程用于发射,您可以只执行写入并在doOnNext
中休眠:
var subject=PublishSubject.create().toSerialized();
主题
.observeOn(Schedulers.io())
.doOnNext(数据包->{
outputStream.write(数据包);
outputStream.flush();
睡眠(50);
})
.subscribe();
专用线程满足我的场景。非常感谢@akarnokd
Example:
Place1: createCommand1(),
Place2: createCommand1(), createCommand4()
Place3: createCommand1(), createCommand2(), .... createCommand10()