39

サーバーに接続するアプリケーションを開発しています。これで、サーバーが使用可能な場合、ログインとデータ送信は正常に機能します。この問題は、サーバーが使用できない場合に発生します。この場合、メソッドはログイン要求を送信し、応答を待ちます。

サーバーが利用可能(表示)かどうかを確認する方法を知っている人はいますか?

実装する必要のある単純なロジックの擬似コードは次のとおりです。

  1. String serverAddress =(構成ファイルから値を読み取る)//すでに完了
  2. boolean serverAvailable =(サーバーserverAddressが使用可能かどうかを確認します)//実装する必要があります
  3. (ここにserverAvailableに依存するロジックがあります)
4

7 に答える 7

51

彼はAndroidで作業しているので、おそらくJavaコードが必要です。Javaに相当するもの(Androidで動作すると私は信じています)は次のようになります。

InetAddress.getByName(host).isReachable(timeOut)
于 2009-09-18T09:04:46.743 に答える
21

単純なpingのようなテストで、これは私にとってはうまくいきました:

static public boolean isURLReachable(Context context) {
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = cm.getActiveNetworkInfo();
    if (netInfo != null && netInfo.isConnected()) {
        try {
            URL url = new URL("http://192.168.1.13");   // Change to "http://google.com" for www  test.
            HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
            urlc.setConnectTimeout(10 * 1000);          // 10 s.
            urlc.connect();
            if (urlc.getResponseCode() == 200) {        // 200 = "OK" code (http connection is fine).
                Log.wtf("Connection", "Success !");
                return true;
            } else {
                return false;
            }
        } catch (MalformedURLException e1) {
            return false;
        } catch (IOException e) {
            return false;
        }
    }
    return false;
}

この関数を(メインスレッドではなく)スレッドで実行することを忘れないでください。

于 2013-06-05T19:34:24.257 に答える
8

あなたが使用することができます

InetAddress.getByName(host).isReachable(timeOut)

ただし、ホストがtcp 7で応答していない場合は、正常に機能しません。この関数を使用して、必要なポートでホストが使用可能かどうかを確認できます。

public static boolean isHostReachable(String serverAddress, int serverTCPport, int timeoutMS){
    boolean connected = false;
    Socket socket;
    try {
        socket = new Socket();
        SocketAddress socketAddress = new InetSocketAddress(serverAddress, serverTCPport);
        socket.connect(socketAddress, timeoutMS);
        if (socket.isConnected()) {
            connected = true;
            socket.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        socket = null;
    }
    return connected;
}
于 2014-05-27T08:34:29.900 に答える
4
public static boolean IsReachable(Context context) {
    // First, check we have any sort of connectivity
    final ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    final NetworkInfo netInfo = connMgr.getActiveNetworkInfo();
    boolean isReachable = false;

    if (netInfo != null && netInfo.isConnected()) {
        // Some sort of connection is open, check if server is reachable
        try {
            URL url = new URL("http://www.google.com");
            //URL url = new URL("http://10.0.2.2");
            HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
            urlc.setRequestProperty("User-Agent", "Android Application");
            urlc.setRequestProperty("Connection", "close");
            urlc.setConnectTimeout(10 * 1000);
            urlc.connect();
            isReachable = (urlc.getResponseCode() == 200);
        } catch (IOException e) {
            //Log.e(TAG, e.getMessage());
        }
    }

    return isReachable;
}

それを試して、私のために働いて、アクティブなandroid.permission.ACCESS_NETWORK_STATEを忘れないでください

于 2014-10-31T19:15:38.117 に答える
2

HTTPを使用していますか?次に、HTTP接続に次のようにタイムアウトを設定できます。

private void setupHttpClient() {
    BasicHttpParams httpParams = new BasicHttpParams();

    ConnManagerParams.setTimeout(httpParams, CONNECTION_TIMEOUT);
    //...

    ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager(
            httpParams, schemeRegistry);
    this.httpClient = new DefaultHttpClient(cm, httpParams);
}

その後、リクエストを実行すると、指定されたタイムアウト後に例外が発生します。

于 2009-09-18T11:36:31.737 に答える
2
public boolean isConnectedToServer(String url, int timeout) {
try{
    URL myUrl = new URL(url);
    URLConnection connection = myUrl.openConnection();
    connection.setConnectTimeout(timeout);
    connection.connect();
    return true;
} catch (Exception e) {
    // Handle your exceptions
    return false;
 }
}
于 2015-06-28T19:50:11.103 に答える
0

ああ、いや、Javaのコードは機能しません:InetAddress.getByName( "fr.yahoo.com")。isReachable(200)LogCatでそのIPアドレスを見ましたが(20000ミリ秒のタイムアウトと同じ) 。

'ping'コマンドの使用は便利なようです。次に例を示します。

ランタイムruntime=Runtime.getRuntime();
プロセスproc=runtime.exec( "ping fr.yahoo.com -c 1"); //他のサーバー、たとえば
proc.waitFor();
int exit = proc.exitValue();
if(exit == 0){//通常の終了
    /*pingコマンドの実行の出力コンテンツを取得して解析します
     *サーバーが到達可能かどうかを判断する
     * /
} else {//異常終了なので、サーバーに到達できないと判断します
    ..。
}
于 2010-05-07T11:37:08.783 に答える