我正在开发一个连接到服务器的应用程序。如果服务器可用,登录和数据传输现在都很正常。问题出现在服务器不可用的情况下。在这种情况下,该方法会发送一个登录请求并等待响应。
有人知道如何检查服务器是否可用(可见)吗?
必须实现以下简单逻辑的伪代码:
- String serverAddress =(从配置文件中读取值)//已完成
- boolean serverAvailable =(检查服务器serverAddress是否可用)//需要实现
- (这里是取决于serverAvailable的逻辑)
我正在开发一个连接到服务器的应用程序。如果服务器可用,登录和数据传输现在都很正常。问题出现在服务器不可用的情况下。在这种情况下,该方法会发送一个登录请求并等待响应。
有人知道如何检查服务器是否可用(可见)吗?
必须实现以下简单逻辑的伪代码:
他可能需要Java代码,因为他在开发Android应用。我相信以下Java代码可以在Android上运行:
InetAddress.getByName(host).isReachable(timeOut)
isReachable()
会简单地超时。 - Paul Lammertsma通过一个简单的类似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中的代码无法工作: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(); if (exit == 0) { // 正常退出 /* 获取执行ping命令的输出内容并解析它, * 以决定服务器是否可达 */ } else { // 异常退出,因此决定该服务器不可达 ... }