全部博文(403)
2012年(403)
分类: 系统运维
2012-04-23 22:08:54
Android网络应用(第一部分)
1 应用模式比较好的做法是使用web服务器完成业务逻辑,这样B/S应用和手机应用可以使用相同的业务逻辑,只有界面层的变化,系统架构统一,可维护性更好。
1.1 连接方式
网络编程的常规模式有有Socket和HTTP两种,各类语言都有两种实现方式相应的API。由于手机的移动特点,手机应用一般都是Http模式。
2 应用场景 2.1 返回业务数据:这是非常常见的应用场景,比如查询数据列表,执行数据的增、删、改后返回执行状态。
2.1.1服务器端以JSP应用为例:服务器端(tomcat或weblogic…)getParameter("")后,调用业务逻辑层方法执行业务逻辑,返回结果list< model >,view得到model后在解析jsp页面,标签部分放入相应数据。如果是Spring/struts等框架,则MVC的映射是由框架完成。
如果是手机应用,model就不需要传递给jsp页面了,直接返回给手机客户端,有客户端构造手机界面
编码方式一:
1. PrintWriter out = response.getWriter() //得到PringWriter对象
2. 执行业务逻辑或者结果
3. out.print(model); //将获得的结果输出,这里model一般是是转换为josn对象方便客户端使用
这种方式和ajax的调用非常像。可以写在serverlet中,也可以使用spring/struts等框架实现
2.1.2手机端
由于httpclient保存session信息,一般返回数据使用httpclient,很少使用HttpURLConnection。
2.1.1.1 使用HttpURLConnection使用HttpURLConnection,GET方式稍简,post需要将参数output
Get方式
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5000); //超时时间
conn.setRequestMethod("GET");
if(conn.getResponseCode() == 200){
InputStream inStream = conn.getInputStream();
从inStream中获得数据,渲染界面;
}
POST方式
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5000); //超时时间
conn.setRequestMethod("POST");
conn.setDoOutput(true);//允许对外输出数据
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setRequestProperty("Content-Length", String.valueOf(entity.length));
OutputStream outStream = conn.getOutputStream();
outStream.write(entity);//写入请求参数
if(conn.getResponseCode() == 200){
InputStream inStream = conn.getInputStream();
从inStream中获得数据,渲染界面;
}
2.1.1.2 使用httpClient
GET方式
HttpGet get = new HttpGet(url);
HttpResponse httpResponse = httpClient.execute(get);
if (httpResponse.getStatusLine().getStatusCode() == 200)
{
String result = EntityUtils.toString(httpResponse.getEntity());
return result;
}
POST方式
HttpPost post = new HttpPost(url) //获得httpPost对象
for(String key : rawParams.keySet()) // rawParam是已经封装好的参数MAP
{
//封装请求参数
params.add(new BasicNameValuePair(key , rawParams.get(key)));
}
// 设置请求参数到httpPost
post.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
// 根据httpPost对象发送POST请求
HttpResponse httpResponse = httpClient.execute(post);
// 如果服务器成功地返回响应
if (httpResponse.getStatusLine().getStatusCode() == 200)
{
String result = EntityUtils.toString(httpResponse.getEntity());//http.util的EntityUtils类获得//结果
return result;
}
2.2 返回文件: 2.2.1服务器端有两种常见方式,第1种直接下载比如一般下载网站多是这种形式,输入URL可查询下载列表。 第二种是使用response.getOutputStream()输出二进制流。
这里用的是也是第一种方式。如果文件在外部文件服务器上,可使用虚拟目录映射。
2.2.2手机端这里使用HttpURLConnection更加灵活,由于手机网络应用速度低,容易掉线,所以要做多线程断点下载的考虑。
网络上的资源比较多。大致如下:
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5*1000);
conn.setRequestMethod("GET");
conn.setRequestProperty("Accept", "image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*");
conn.setRequestProperty("Accept-Language", "zh-CN");
conn.setRequestProperty("Referer", downloadUrl);
conn.setRequestProperty("Charset", "UTF-8");
conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)");
conn.setRequestProperty("Connection", "Keep-Alive");
conn.connect();
可获得输入流,多线程下载:创建RandomAccessFile文件,每个线程下载RandomAccessFile的一部分,断点续传:使用配置文件或者sqllite记录文件下载量实现。
2.3 返回xml等临时生成文件 2.2.1服务器端在serverlet中使用PrintWriter对象实现xml文档的构造,输出
PrintWriter out = response.getWriter();
// 拼XML格式数据
out.println("");
// 根节点
out.println("
for (int i = 0; i
Menu m = (Menu)list.get(i);
out.println("
out.print("
out.print(m.getId());
out.println("");
// 备注
out.print("
out.print(m.getRemark());
out.println("");
out.println("");
}
out.println("");
out.flush();
out.close();
2.2.2手机端和2.1的业务场景类似,使用URLConnection获得输出流
URLConnection conn = url.openConnection();
// 获得输入流
InputStream in = conn.getInputStream();
// 使用pull或者DOM解析输入流
第二部分谈一下上传文件和发送xml,调用webservice