簡體   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