在RxJava中同时从套接字读写
我是一名RxJava新手,试图完成以下简单任务:在RxJava中同时从套接字读写,java,sockets,rx-java,reactive-programming,Java,Sockets,Rx Java,Reactive Programming,我是一名RxJava新手,试图完成以下简单任务: 通过套接字连接到定期发送数据的服务器 在数据到达时读取数据 如果套接字可写,则每隔n毫秒向服务器写入心跳消息 我编写了工作RxJava程序来“连接并读取”和“连接并写入”,但现在我想编写一个既能连接又能写入的程序。我有一个连接到插座的功能: Observable<SocketChannel> connect(String host,int port) { ... 当我运行程序时,“读取n字节”消息会定期出现,但心跳不会被写入 但
- 通过套接字连接到定期发送数据的服务器
- 在数据到达时读取数据
- 如果套接字可写,则每隔
毫秒向服务器写入心跳消息n
Observable<SocketChannel> connect(String host,int port) { ...
当我运行程序时,“读取n字节”消息会定期出现,但心跳不会被写入
但是,以下程序有效:
connect("localhost", 31337)
.flatMap(s ->
Observable
.interval(2500, TimeUnit.MILLISECONDS)
.flatMap(ignore -> whenWritable(s)))
.forEach(ignore -> println("write heart beat"));
这里的问题是什么?我的读写方法在RxJava中是惯用的吗?这可能是因为
readFromSocket(socket)
是同步的,然后readFromSocket(socket)。forEach
将阻塞,之后的代码将无法运行。您可以在readFromSocket(socket)之后添加日志。forEach
检查日志
要解决此问题,可以使用
readFromSocket(socket).subscribeOn(Schedulers.io())
在io线程池中运行读取操作。正是这样,使用subscribeOn
解决了此问题,谢谢!
Observable<SocketChannel> whenWritable(SocketChannel s) {
connect("localhost", 31337).forEach(socket -> {
readFromSocket(socket)
.forEach(bytes -> printf("read %d bytes",bytes.length);
Observable
.interval(2500, TimeUnit.MILLISECONDS)
.flatMap(ignore -> whenWritable(socket))
.forEach(ignore -> println("write heart beat"));
});
connect("localhost", 31337)
.flatMap(s ->
Observable
.interval(2500, TimeUnit.MILLISECONDS)
.flatMap(ignore -> whenWritable(s)))
.forEach(ignore -> println("write heart beat"));