Android:如何检查服务器是否可用?

我正在开发一个连接到服务器的应用程序。 到目前为止,如果服务器可用,login和数据传输工作正常。 服务器不可用时出现问题。 在这种情况下,该方法发送login请求并等待响应。

有谁知道如何检查服务器是否可用(可见)?

必须实施的简单逻辑的伪代码如下:

  1. String serverAddress =(从configuration文件读取值)//已经完成
  2. 布尔serverAvailable =(检查服务器serverAddress是否可用)//必须实现
  3. (这取决于serverAvailable的逻辑)

自从他开始使用Android之后,他可能需要Java代码。 Java相当于我认为的Android应该是:

InetAddress.getByName(host).isReachable(timeOut) 

通过一个简单的pingtesting,这为我工作:

 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

你使用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); } 

如果您然后执行一个请求,您将在给定的超时后收到一个exception。

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

哦,不,不,在Java中的代码不起作用:InetAddress.getByName(“fr.yahoo.com”),isReachable(200)虽然在LogCat中我看到了它的IP地址(与20000毫秒的时间相同) 。

看起来使用“ping”命令很方便,例如:

 Runtime runtime = Runtime.getRuntime();
 Process proc = runtime.exec(“ping fr.yahoo.com -c 1”);  //其他服务器,例如
 proc.waitFor();
 int exit = proc.exitValue();
如果(退出== 0){/ /正常退出
     / *获取执行ping命令的输出内容并parsing
      *来决定服务器是否可达
      * /
 }其他{/ /exception退出,所以决定服务器不可达
     ...
 }