Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在RxJava中同时从套接字读写_Java_Sockets_Rx Java_Reactive Programming - Fatal编程技术网

在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字节”消息会定期出现,但心跳不会被写入 但

我是一名RxJava新手,试图完成以下简单任务:

  • 通过套接字连接到定期发送数据的服务器
  • 在数据到达时读取数据
  • 如果套接字可写,则每隔
    n
    毫秒向服务器写入心跳消息
我编写了工作RxJava程序来“连接并读取”和“连接并写入”,但现在我想编写一个既能连接又能写入的程序。我有一个连接到插座的功能:

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"));