Android:如何检查服务器是否可用?
我正在开发一个连接到服务器的应用程序。 到目前为止,如果服务器可用,login和数据传输工作正常。 服务器不可用时出现问题。 在这种情况下,该方法发送login请求并等待响应。
有谁知道如何检查服务器是否可用(可见)?
必须实施的简单逻辑的伪代码如下:
- String serverAddress =(从configuration文件读取值)//已经完成
- 布尔serverAvailable =(检查服务器serverAddress是否可用)//必须实现
- (这取决于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退出,所以决定服务器不可达 ... }