サーバーに接続するアプリケーションを開発しています。サーバーが使用可能であれば、ログインとデータ送信は正常に機能します。この問題は、サーバーが利用できないときに発生します。この場合、メソッドはログイン要求を送信し、応答を待ちます。
サーバーが使用可能(表示)であるかどうかを確認する方法を知っていますか?
実装する必要がある単純なロジックの擬似コードは次のとおりです。
彼はAndroidに取り組んでいるので、おそらくJavaコードが必要です。 Javaに相当するもの(Androidで動作すると信じています)は次のようになります。
InetAddress.getByName(Host).isReachable(timeOut)
簡単な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;
}
(メインスレッドではなく)スレッドでこの関数を実行することを忘れないでください。
使用できます
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;
}
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を忘れないでください
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;
}
}
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);
}
その後、リクエストを実行すると、指定されたタイムアウト後に例外が発生します。
ああ、いや、いや、Javaのコードは動作しません:LogCatでそのIPアドレスを見ましたが(タイムアウト20000ミリ秒)。
「ping」コマンドの使用は便利なようです、例えば:
Runtime runtime = Runtime.getRuntime(); Process proc = runtime.exec( "ping fr.yahoo.com -c 1"); //他のサーバー、たとえば proc.waitFor(); int exit = proc.exitValue(); if(exit == 0){//通常exit /* pingコマンド実行の出力内容を取得して解析します *サーバーが到達可能かどうかを判断します */ } else {//異常終了、そのため、サーバーに到達できないと判断します ... }