繁体   English   中英

在RxJava中同时从Socket读写

[英]Read and write from a Socket simultaneously in RxJava

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

  • 通过套接字连接到定期发送数据的服务器
  • 在数据到达时读取数据
  • 如果套接字是可写的,则每隔n毫秒向服务器写一条心跳消息

我编写了工作RxJava程序来“连接和读取”和“连接和写入”,但现在我想写一个同时执行这两个程序的程序。 我有一个连接到套接字的功能:

Observable<SocketChannel> connect(String host,int port) { ...

...从中读取的功能

Observable<byte[]> readFromSocket(SocketChannel s) {

...以及测试可写性的函数(它在可写时返回套接字)

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

当我运行程序时,“读取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线程池中运行读取操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM