2

Android アプリケーションに ping コマンド スレッドを挿入しようとしましたが、サーバーに到達できると、コードはうまく機能します。サーバーに到達できない場合、プロセスがハングし、その理由がわかりません。

このコードは、ホストが解決可能かどうかに関係なく、エミュレーターで機能しますが、実際のデバイスでは、process.waitFor が返されることはなく、出力は入力または出力ストリームから発行されません。

何か案は?

protected double executePing(String ipAddress) {
    List<String> commands = new ArrayList<String>();
    commands.add("/system/bin/ping");
    commands.add("-c");
    commands.add("5");
    commands.add("-w");
    commands.add("5");
    commands.add("128.128.128.128");
    try {
        this.doCommand(commands);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return laten;
}

private void doCommand(List<String> command) throws IOException{

    ProcessBuilder pb = new ProcessBuilder(command);
    Process process = pb.start();

    // any error message?
    StreamGobbler errorGobbler = new StreamGobbler(
            process.getErrorStream(), "ERROR");

    // any output?
    OutputStreamGobbler outputGobbler = new OutputStreamGobbler(
            process.getInputStream(), "OUTPUT");

    // kick them off
    errorGobbler.start();
    outputGobbler.start();

    // read the output from the command
    try {
        exitVal = process.waitFor();
        //Sleep for 10 secs to try to clear the buffer
        Thread.sleep(6000);

        //pingVal = echo.toString();
        if(exitVal == 0 && !pingVal.isEmpty()){
            //System.out.println("PING STATS: "+pingVal);
            try{
            pingVal = pingVal.substring(pingVal.lastIndexOf("rtt min/avg/max/mdev"));
            pingVal = pingVal.substring(23);
            pingVal = pingVal.substring(pingVal.indexOf("/")+1);
            laten = Double.parseDouble(pingVal.substring(0,pingVal.indexOf("/")));
            }catch (IndexOutOfBoundsException ex){
                System.out.println("PING VAL: "+ pingVal);
                ex.printStackTrace();
            }
        }


    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    System.out.println("ExitValue: " + exitVal);
}
4

1 に答える 1

0

1 つのオプションは、ping を実行する新しいスレッドを作成し、それを一定時間開いたままにすることです (これをタイムアウトと呼びます)。必要な時間内に必要な応答が得られない場合は、スレッドを閉じて再試行できます。または、プロセスを強制終了します。これにより、特定の応答コードとタイムアウトを確認できます。

于 2013-07-08T20:19:31.920 に答える