3

サーバーにコマンドを送信し、応答があるかどうかを確認したい。

現在、サーバーからの応答があるまでブロックする関数を使用しBufferedReaderreadline()いますが、最初にサーバーからの応答があることを確認するだけです。

このブロックを使用ready()またはreset()回避しようとしましたが、役に立ちません。

これにより、サーバーが応答するのを待ってプログラムが動かなくなりますが、決して起こりません。InputStreamReader私の理解では、同じことをしているようです。

この件に関してここで見つけた他の質問は私の質問に答えませんでしたので、私の質問に答えていただければ幸いです。

4

4 に答える 4

3

応答を非同期で読み取りたい場合は、BufferedReader を読み取るスレッドを開始することをお勧めします。これは、コーディングがはるかに簡単で、制御が容易です。

于 2012-06-30T12:00:36.343 に答える
1

必要なのは でInputStreamラップせずにだけかもしれませんBufferedReader

while (inputStream.available() > 0) {
     int i = inputStream.read(tmp, 0, 1024);
     if (i < 0)
          break;
     strBuff.append(new String(tmp, 0, i));
}

これが役立つことを願っています。

于 2012-06-30T11:48:10.203 に答える
0

最近、CountDownLatch を使用して同様のことを行いました。もっと良い方法があるかもしれませんが、これはかなり簡単で、かなりうまくいくようです。CountDownLatch の待機時間は、ニーズに合わせて調整できます。

package com.whatever;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class TestRead {
    private static final Logger log = LoggerFactory.getLogger(TestRead.class);
    private CountDownLatch latch = new CountDownLatch(1);

    public void read() {
        URLReader urlReader = new URLReader();
        Thread listener = new Thread(urlReader);
        listener.setDaemon(true);
        listener.start();
        boolean success = false;
        try {
            success = latch.await(20000, TimeUnit.MILLISECONDS);
        } catch (InterruptedException e) {
            log.error("error", e);
        }
        log.info("success: {}", success);
    }

    class URLReader implements Runnable {
        public void run() {
            log.info("run...");
            try {
                URL oracle = new URL("http://www.oracle.com/");
                URLConnection yc = oracle.openConnection();
                BufferedReader in = new BufferedReader(new InputStreamReader(yc.getInputStream()));
                String inputLine;
                while ((inputLine = in.readLine()) != null)
                    System.out.println(inputLine);
                in.close();
                latch.countDown();
            } catch (Exception ex) {
                log.error("error", ex);
            }
            log.info("consumer is done");
        }

    }
    public static void main(String[] args) {
        TestRead testRead = new TestRead();
        testRead.read();
    }
}
于 2012-06-30T17:25:50.040 に答える