注意:在进行Android开发测试HTTP通信时,要特别注意url地址,首先明确测试的工具是模拟器还是真机,在模拟器上可以使用“10.0.2.2:自己的端口号”,在真机测试时务必保证我们的服务端和手机客户端必须在同一网段,如我在学校测试电脑连接的是校园网,真机连接的也必须是校园网,不能是2g网络或者3g等等,其ip地址可以通过ipconfig查看本机的ip号。
一、HTTP通信机制
在我们的Android项目开发中,有两种方式实现HTTP通信,实现和服务器的数据交互,一种是采用HttpClient,一种是HttpURLConnection。
二、实例
1、HttpClient方式
/**
* 采用HttpClient进行通信:请求方式为post
* 针对一般的文本数据传输,不包括图片等其他文件
* 1、创建一个HttpClient对象
* 2、创建HttpPost对象,关联到uri地址
* 3、发送请求等待回应
* 4、得到服务器返回结果
* @return
*/
private String send1() {
// 这里面的参数可以封装成键值对
NameValuePair nameValuePair1 = new BasicNameValuePair("name", "yang");
NameValuePair nameValuePair2 = new BasicNameValuePair("pwd", "123123");
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(nameValuePair1);
nameValuePairs.add(nameValuePair2);
String uri = "http://10.0.2.2:8080/HttpDemoServer/TestServlet";
try {
HttpParams httpParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParams, 5000);
// 1、创建一个HttpClient对象
HttpClient client = new DefaultHttpClient(httpParams);
// 2、创建请求对象HttpPost,通过这个对象设置请求头headers和请求体body,这里的body可以不是键值对
HttpPost httpPost = new HttpPost(uri);
if (nameValuePairs != null && nameValuePairs.size() != 0) {
httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs,
HTTP.UTF_8));
}
// 3、发送请求并等待响应
HttpResponse httpResponse = client.execute(httpPost);
// 4、得到服务器返回的字符串
if (httpResponse.getStatusLine().getStatusCode() == 200) {
HttpEntity entity = httpResponse.getEntity();
return EntityUtils.toString(entity,"UTF-8");
} else {
return "网络异常";
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("网络异常!");
}
return "网络异常";
}
2、HttpURLConnection方式
/**
* 采用HttpUrlConnection通信:请求方式为get
* 针对一般的文本数据传输,不包括图片等其他文件
* @return
*/
private String send2() {
// String validateURL = "http://zjx:8080/Test?name=yang";
String uri = "http://10.0.2.2:8080/HttpDemoServer/TestServlet?name=xingzjx&pwd=111";
// 1、创建一个HttpURLConnection连接
HttpURLConnection conn = null;
try {
// 2、创建一个URL对象,拿到uri地址
URL url = new URL(uri);
conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5000);
conn.setRequestMethod("GET");
// 3、建立到远程对象的实际连接
conn.connect();
// 4、成功后得到服务器返回的字符串
// DataInputStream dis = new DataInputStream(conn.getInputStream());
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String str = null;
StringBuffer sb = new StringBuffer();
while((str = br.readLine())!=null) {
sb.append(str);
}
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
return sb.toString();
} else {
return "网络异常";
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (conn != null) {
conn.disconnect(); // 中断连接
}
}
return "网络异常";
}
三、两种通信机制的比较
HttpClient是阿帕奇下的一个开源项目,封装了Http请求头,参数,内容体,响应等信息。HttpURLConnection是java里面的的标准类,没做封装,使用起来不方便。所以一般情况下使用HttpURLConnection比较好。
下面是测试用的demo:http://download.csdn.net/detail/u010213127/8492027
里面有一个基于HttpClient实现的封装。