3

Java ソケットを使用して ping プログラムを作成しています。私のプログラムのバグの 1 つは、時々接続できず、ずっとそこにとどまっていることです。そのため、タイムアウト (20 秒後) を追加しようとしていますが、ping は失敗します。しかし、方法がわかりません。

これが私のpingプログラムの一部です:

boolean result = false;
long before1 = System.nanoTime();
out.println(new byte[64]);
System.out.println("(1) Sent 64 bytes of data to " + address
                    + "...");
try {
    if ((in.readLine()) != null) {
        int size = in.readLine().toString().getBytes().length;
        long after = System.nanoTime();
        long s = ((after - before1) / 1000000L) / 1000;
        System.out.println("(1) Recieved reply from " + address
            + " (" + size + " bytes), time = " + s
                + " seconds...");
        result = true;
    } else if ((in.readLine()) == null) {
        long after = System.nanoTime();
        long s = ((after - before1) / 1000000L) / 1000;
        System.out.println("(1) Failed to recieve reply from "
            + address + ", time = " + s + " seconds...");
            result = false;
    }

} catch (IOException exc) {

    long after = System.nanoTime();
    long s = ((after - before1) / 1000000L) / 1000;
    System.err.println("(1) Failed to recieve reply from "
        + address + ", time = " + s + " seconds...\nReason: "
                        + exc);
    result = false;

}

しかし、次の代わりに、コードの任意の場所で経過時間を測定したいと思います。

long time = System.nanoTime();

コードの一部が何かをしているときにスタックすると、20 秒後にタイムアウトになります。
try/catch ブロックの開始時またはコード内の他の場所で 20 秒が経過したかどうかを測定して、ping 中にスタックしないようにする方法に関する提案はありますか?

4

3 に答える 3

1

FutureFutureTaskを使用できます。

   ExecutorService pingExecutor = ... // executor service to run the ping in other thread

   void showPing(final String target) throws InterruptedException {

     Future<String> ping = executor.submit(new Callable<String>() {
         public String call() {
             String pingResult = ... // do your Ping stuff
             return pingResult;
         }});

     System.out.println("Pinging..."); // do other things while searching

     try {
       System.out.println(future.get(20, TimeUnit.SECONDS)); // use future, waits 20 seconds for the task to complete
     } catch (ExecutionException ex) {
     } catch (TimeoutException tex) {
       // Ping timed out
     }
   }
于 2013-04-05T20:36:12.107 に答える
0

ここでいくつかのヒントを見つけることができます: Java でタイムアウトを使用してブロッキング メソッドを呼び出すにはどうすればよいですか?

将来のインターフェースは、あなたの問題に対する良い解決策のようです。ただし、タスクの内容によっては、実際にキャンセルできない可能性があることに注意してください。追加情報:

于 2013-04-05T20:40:08.370 に答える