簡體   English   中英

如何在Android中了解服務器是否可達?

[英]How to know the server in reachable or not in android?

嗨,我想知道我的網站可訪問或可用嗎?

我知道我的設備是否在線:

protected boolean isOnline() {

        ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo netInfo = cm.getActiveNetworkInfo();
        if (netInfo != null && netInfo.isConnectedOrConnecting()) {
            Toast.makeText(this, "You are connecting to Internet!", Toast.LENGTH_LONG).show();
            return true;
        } else {
            Toast.makeText(this, "You are not connecting to Internet!", Toast.LENGTH_LONG).show();
            return false;
        }
    }

使用這種方法,我想知道URL是否可用:

public boolean isServerReachable(String serverURL) {

        ConnectivityManager connMan = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo netInfo = connMan.getActiveNetworkInfo();
        if (netInfo != null && netInfo.isConnected()) {
            try {
                URL urlServer = new URL(serverURL);
                HttpURLConnection urlConn = (HttpURLConnection) urlServer.openConnection();
                urlConn.setConnectTimeout(3000); //<- 3Seconds Timeout
                urlConn.connect();
                if (urlConn.getResponseCode() == 200) {
                    Toast.makeText(this, "Server is Available", Toast.LENGTH_LONG).show();
                    return true;
                } else {
                    Toast.makeText(this, "Server is not Available", Toast.LENGTH_LONG).show();
                    return false;
                }
            } catch (MalformedURLException e1) {
                return false;
            } catch (IOException e) {
                return false;
            }
        }
        return false;
    }

然后我創建一個Button,單擊時將調用這兩個方法,如下所示:

if (isOnline()) {
    isServerReachable("https://www.google.com/");
 }

如果WiFi關閉,當我單擊按鈕時,此消息將顯示:

您沒有連接到互聯網!

當WiFi開啟時,此錯誤將顯示:

> Process: com.rastari.salar.salytest, PID: 3864
>     android.os.NetworkOnMainThreadException
>             at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1147)
>             at java.net.InetAddress.lookupHostByName(InetAddress.java:418)
>             at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)
>             at java.net.InetAddress.getAllByName(InetAddress.java:215)
>             at com.android.okhttp.HostResolver$1.getAllByName(HostResolver.java:29)
>             at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:232)
>             at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:124)
>             at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:272)
>             at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:211)
>             at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:382)
>             at com.android.okhttp.internal.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:106)
>             at com.android.okhttp.internal.http.DelegatingHttpsURLConnection.connect(DelegatingHttpsURLConnection.java:89)
>             at com.android.okhttp.internal.http.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:25)
>             at com.rastari.salar.salytest.MainActivity.isServerReachable(MainActivity.java:78)
>             at com.rastari.salar.salytest.MainActivity$1.onClick(MainActivity.java:37)
>             at android.view.View.performClick(View.java:4780)
>             at android.view.View$PerformClick.run(View.java:19866)
>             at android.os.Handler.handleCallback(Handler.java:739)
>             at android.os.Handler.dispatchMessage(Handler.java:95)
>             at android.os.Looper.loop(Looper.java:135)
>             at android.app.ActivityThread.main(ActivityThread.java:5254)
>             at java.lang.reflect.Method.invoke(Native Method)
>             at java.lang.reflect.Method.invoke(Method.java:372)
>             at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
>             at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 06-25
> 06:14:16.845    1557-1557/? E/EGL_emulation﹕ tid 1557:
> eglCreateSyncKHR(1207): error 0x3004 (EGL_BAD_ATTRIBUTE) 06-25
> 06:14:17.614    1708-1891/? E/WifiStateMachine﹕ CMD_START_SCAN :
> connected mode and no configuration

如何確定服務器可用?

感謝你。

Asynctask調用方法isServerReachable()

由於您是在應用程序的主線程上進行網絡調用,因此崩潰。

該錯誤是由於isServerReachable()方法引起的,因為您正在UI線程中進行聯網操作,這將導致NetworkOnMainThreadException 而不是直接運行它們,而是在AsyncTask或另一個輔助Thread執行該方法。

 public class MyAsyncTask extends AsyncTask<Void, Void, Boolean> {
        @Override
        protected Boolean doInBackground(Void... params) {
            return isServerReachable(URl);
        }

        @Override
        protected void onPostExecute(Boolean aBoolean) {
            super.onPostExecute(aBoolean);
            //Perform operations.
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM