我正在尝试使用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);上面的代码我在线程中运行,因为这可能需要时间。当我第一次运行这个测试时,我得到的结果是真的,但是在行为是随机的之后,有时它会给我错误‘主机无法到达’,我得到的结果是假的。
我只想测试服务器是否可以从当前配置的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函数。当测试完成后,我将向主线程发送包含结果的消息。
谢谢。
发布于 2012-03-16 16:55:28
您的代码没有任何问题。这意味着要么:
1)有时服务器真的无法访问
2)连接速度慢,到达服务器前超时。
因此,测试将超时设置为某个更大的值,例如60000(60sec),然后再次检查。如果它工作了,那么你就知道是因为超时了。
编辑
另外,请进行此更改,也许它会为我们提供更多信息:
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;
}警告:如果您连接到不包含internet访问或需要基于浏览器的身份验证的WiFi网络,connected仍将为true。
您将在清单中需要此权限:<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
https://stackoverflow.com/questions/9734098
复制相似问题