我正在尝试使用HttpGet实现ping,但行为是随机的。
我正在使用以下代码测试互联网/服务器连接:
boolean result = false;
HttpGet request = new HttpGet("www.MyServer.com");
HttpParams httpParameters = new BasicHttpParams();
HttpClient httpClient = new DefaultHttpClient(httpParameters);
try
{
HttpConnectionParams.setConnectionTimeout(httpParameters, 6000);
HttpConnectionParams.setSoTimeout(httpParameters, 6000);
HttpResponse response = httpClient.execute(request);
int status = response.getStatusLine().getStatusCode();
if (status == HttpStatus.SC_OK)
{
result = true;
}
}
catch(Exception e)
{
e.printStackTrace();
result = false;
}
Log.d("App", "Ping Result:"+result);
上面的代码我在线程中运行,因为它可能需要一些时间。 当我第一次运行此测试时,我得到的结果为true,但是在行为是随机的之后,有时它给了我错误'host unreachable'并且我得到结果为false。
我只想测试服务器是否可以从当前配置的Android网络访问。
是否有可靠的API来测试互联网/服务器连接?
更新:
在服务中,我有以下功能启动测试。
void startTest()
{
ServerTestThread mServerTestThread = new ServerTestThread()
mServerTestThread.start();
}
class ServerTestThread extends Thread
{
boolean result = false;
public void run()
{
//HttpGet code
//Send Message TO GUI Thread with result.
}
}
以上startTest
函数正在创建测试线程的实例并调用start函数。当测试完成后,我将消息发送到包含结果的主线程。
感谢。
答案 0 :(得分:2)
您的代码没有问题。这意味着:
1)有时服务器确实无法到达 2)连接速度很慢,并且在达到服务器之前超时。
因此,将测试设置超时设置为某个较大的值,例如60000(60秒),然后再次检查。如果它有效,那么你知道这是因为超时。
修改强>
也请进行此更改,也许它会为我们提供更多信息:
Log.d("App", "Status:" + status);
if (status == HttpStatus.SC_OK)
{
result = true;
}
<强> EDIT2 强>
class ServerTestThread extends Thread
{
public static boolean result = false;
public static HttpGet request = new HttpGet("www.MyServer.com");
public static HttpParams httpParameters = new BasicHttpParams();
public static HttpClient httpClient = new DefaultHttpClient(httpParameters);
boolean result = false;
public void run()
{
//HttpGet code
//Send Message TO GUI Thread with result.
}
}
<强> EDIT3 强>
这将告诉您是否连接到网络:
boolean connected = false;
ConnectivityManager connectivityManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
if(connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState() == NetworkInfo.State.CONNECTED ||
connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState() == NetworkInfo.State.CONNECTED) {
//we are connected to a network
connected = true;
}
警告:如果您连接的WiFi网络不包含互联网访问权限或需要基于浏览器的身份验证,connected
仍然有效。
您的清单中需要此权限:
<uses-permission
android:name="android.permission.ACCESS_NETWORK_STATE" />