Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1049970
  • 博文数量: 403
  • 博客积分: 10272
  • 博客等级: 上将
  • 技术积分: 4407
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-24 14:22
文章分类

全部博文(403)

文章存档

2012年(403)

分类: 系统运维

2012-04-23 22:08:54

Android网络应用(第一部分)

1       应用模式

比较好的做法是使用web服务器完成业务逻辑,这样B/S应用和手机应用可以使用相同的业务逻辑,只有界面层的变化,系统架构统一,可维护性更好。

 

 

1.1     连接方式

网络编程的常规模式有有SocketHTTP两种,各类语言都有两种实现方式相应的API。由于手机的移动特点,手机应用一般都是Http模式。

2       应用场景 2.1     返回业务数据:

这是非常常见的应用场景,比如查询数据列表,执行数据的增、删、改后返回执行状态。

2.1.1服务器端

JSP应用为例:服务器端(tomcatweblogic…)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

使用HttpURLConnectionGET方式稍简,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.utilEntityUtils类获得//结果

         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

 

阅读(1701) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~