سؤال

انا تطوير تطبيق الذي يربط إلى ملقم.الآن تسجيل الدخول ونقل البيانات يعمل بشكل جيد إذا كان الملقم هو متاح.المشكلة تنشأ عندما يكون الملقم غير متوفر.في هذه الحالة طريقة يرسل طلب تسجيل الدخول و ينتظر الرد.

لا أحد يعرف كيفية التحقق إذا كان الملقم متوفرة (مرئية)?

شبة الكود من المنطق البسيط أن يكون تنفيذها هي التالية:

  1. سلسلة serverAddress = (قراءة قيمة من ملف التكوين) //بالفعل
  2. منطقية serverAvailable = (التحقق إذا كان الملقم serverAddress متاح)//لم ينفذ
  3. (هنا يأتي المنطق الذي يعتمد على serverAvailable)
هل كانت مفيدة؟

المحلول

وربما يحتاج كود جافا حيث انه يعمل على الروبوت.جافا ما يعادل -- الذي أعتقد أنه يعمل على الروبوت -- يجب أن تكون:

InetAddress.getByName(host).isReachable(timeOut)

نصائح أخرى

مع بسيطة بينغ-مثل اختبار هذا عملت بالنسبة لي :

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;
}

محاولة العمل بالنسبة لي و لا تنسى actived الروبوت.إذن.ACCESS_NETWORK_STATE

هل يعمل مع 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);
}

إذا كنت ثم تنفيذ الطلب ، سوف تحصل على استثناء بعد إعطاء مهلة.

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;
 }
}

كلا التعليمات البرمجية في جافا لا تعمل:InetAddress.getByName("fr.yahoo.com").بهذه الصيغة. (200) على الرغم من أن في LogCat رأيت عنوان IP الخاص به (نفس الشيء مع 20000 مللي من الوقت).

يبدو أن استخدام 'بينغ' قيادة مريحة ، على سبيل المثال:

Runtime runtime = Runtime.getRuntime();
Process proc = runtime.exec("ping fr.yahoo.com -c 1"); // other servers, for example
proc.waitFor();
int exit = proc.exitValue();
if (exit == 0) { // normal exit
    /* get output content of executing the ping command and parse it
     * to decide if the server is reachable
     */
} else { // abnormal exit, so decide that the server is not reachable
    ...
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top