Android(五)数据存储之五网络数据交互.doc_第1页
Android(五)数据存储之五网络数据交互.doc_第2页
Android(五)数据存储之五网络数据交互.doc_第3页
Android(五)数据存储之五网络数据交互.doc_第4页
Android(五)数据存储之五网络数据交互.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

昨天我们只对Android接收网络数据进行了简单介绍,今天我们完成了Android数据存储网络部分的所有内容。在此我将对这非常重要的内容进行总结。本篇日志是对Android与WEB应用服务之间进行数据交互的总结,下篇日志是一个经典而又让人十分好奇的Android多线程断点下载应用的总结。下面我们开始Android与网络数据的交互。一、创建WEB应用服务使用eclipse3.5创建一个动态WEB应用,使用Struts1处理用户请求。我们此应用添加一个DispatchAction,并为它添加四个方法创建用于处理Android以各种方式提交的请求。1.创建动态WEB工程Project name:AndroidWebServerTarget runtime:Apache Tomcat v6.0Dynamic web module version:2.5Configuration:Default Configuration for Apache Tomcat v6.02.添加DispatchActionpackagecom.changcheng.web.struts.actions;importjava.io.File;importjava.io.FileOutputStream;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importorg.apache.struts.action.ActionForm;importorg.apache.struts.action.ActionForward;importorg.apache.struts.action.ActionMapping;importorg.apache.struts.actions.DispatchAction;importcom.changcheng.web.struts.forms.DataForm;publicclassAndroidWebServerextendsDispatchAction /Andoird以Get方式发送的请求publicActionForward sendDataByGet(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)throwsException String name = request.getParameter(name);request.setAttribute(message,Hello + name);returnmapping.findForward(success);/Andoird以Post方式发送的请求publicActionForward sendDataByPost(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)throwsException String name = request.getParameter(name);request.setAttribute(message,Hello + name);returnmapping.findForward(success);/ Andoird以表单方式发送的请求publicActionForward sendDataByForm(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)throwsException DataForm formbean = (DataForm) form;System.out.println(StrData:+ formbean.getStrData();/获取上传的文件if(formbean.getFileData() !=null& formbean.getFileData().getFileSize() 0) /设置保存目录File dir =newFile(request.getSession().getServletContext().getRealPath(/images);if(!dir.exists()dir.mkdirs();/保存文件FileOutputStream outStream =newFileOutputStream(newFile(dir,formbean.getFileData().getFileName();outStream.write(formbean.getFileData().getFileData();/保存文件outStream.close();returnnull;3.向web.xml添加Struts1的ActionServletstrutsorg.apache.struts.action.ActionServletconfig/WEB-INF/struts-config.xmlstruts*.do4.struts-config.xml二、创建Android应用1.创建Android工程Project name:AndroidWebClientBuildTarget:Android2.1Application name:AndroidWEB应用客户端Package name:com.changcheng.web.clientCreate Activity:AndroidWebClientMin SDK Version:72.AndroidManifest.xmlAndroid应用要访问Internet需要添加权限。3.ClientService类packagecom.changcheng.web.client.service;importjava.io.ByteArrayOutputStream;importjava.io.DataOutputStream;importjava.io.File;importjava.io.FileInputStream;importjava.io.InputStream;.HttpURLConnection;.URL;importjava.util.HashMap;importjava.util.Map;importandroid.os.Environment;importandroid.util.Log;publicclassClientService privatestaticfinalStringTAG=ClientService;/以get方式发送请求publicstaticvoidsendDataToServerByGet()throwsException /主机地址不可以设置为localhost或,必须是本机或其他机器所在Internet网或局域网地址。String path =:8080/AndroidWebServer/server.do?+method=sendDataByGet&name=changcheng;URL url =newURL(path);HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setConnectTimeout(6 * 1000);/请求成功if(conn.getResponseCode() = 200) /获取服务器返回的数据byte data =readStream(conn.getInputStream();Log.i(TAG,newString(data,UTF-8);/以Post方式发送请求,面向HTTP协议编程publicstaticvoidsendDataTOserverByPost()throwsException String path =:8080/AndroidWebServer/server.do;String params =method=sendDataByPost&name=tingting;/请求参数byte data = params.getBytes();URL url =newURL(path);HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setConnectTimeout(6 * 1000);conn.setDoOutput(true);/发送POST请求必须设置允许输出conn.setUseCaches(false);/不使用Cacheconn.setRequestMethod(POST);conn.setRequestProperty(Connection,Keep-Alive);/维持长连接conn.setRequestProperty(Charset,UTF-8);conn.setRequestProperty(Content-Length, String.valueOf(data.length);conn.setRequestProperty(Content-Type,application/x-www-form-urlencoded);DataOutputStream outStream =newDataOutputStream(conn.getOutputStream();outStream.write(data);/以内容实体方式发送请求参数outStream.flush();outStream.close();/请求成功if(conn.getResponseCode() = 200) /获取服务器返回的数据byte html =readStream(conn.getInputStream();Log.i(TAG,newString(html,UTF-8);/以表单方式发送请求publicstaticvoidsendDataToServerByForm()throwsException Map params =newHashMap();params.put(method,sendDataByForm);params.put(strData,字符串数据);/获取SDCard中的good.jpgFile file =newFile(Environment.getExternalStorageDirectory(),app_Goog_Android_w.png);FormFile fileData =newFormFile(app_Goog_Android_w.png,newFileInputStream(file),fileData,application/octet-stream);HttpRequester.post(:8080/AndroidWebServer/server.do, params,fileData);/获取输入流数据privatestaticbyte readStream(InputStream inStream)throwsException byte buffer =newbyte1024;intlen = -1;ByteArrayOutputStream outStream =newByteArrayOutputStream();while(len = inStream.read(buffer) != -1) outStream.write(buffer, 0, len);byte data = outStream.toByteArray();outStream.close();inStream.close();returndata;其中使用到的FormFile类:packagecom.changcheng.web.client.service;importjava.io.InputStream;/*上传文件*/publicclassFormFile /*上传文件的数据*/privatebytedata;privateInputStreaminStream;/*文件名称*/privateStringfilname;/*表单字段名称*/privateStringformname;/*内容类型*/privateStringcontentType=application/octet-stream;publicFormFile(String filname,byte data, String formname, String contentType) this.data= data;this.filname= filname;this.formname= formname;if(contentType!=null)this.contentType= contentType;publicFormFile(String filname, InputStream inStream, String formname, String contentType) this.filname= filname;this.formname= formname;this.inStream= inStream;if(contentType!=null)this.contentType= contentType;publicInputStream getInStream() returninStream;publicvoidsetInStream(InputStream inStream) this.inStream= inStream;publicbyte getData() returndata;publicvoidsetData(byte data) this.data= data;publicString getFilname() returnfilname;publicvoidsetFilname(String filname) this.filname= filname;publicString getFormname() returnformname;publicvoidsetFormname(String formname) this.formname= formname;publicString getContentType() returncontentType;publicvoidsetContentType(String contentType) this.contentType= contentType;其中使用到的HttpRequester类:packagecom.changcheng.web.client.service;importjava.io.DataOutputStream;importjava.io.InputStream;.HttpURLConnection;.URL;importjava.util.ArrayList;importjava.util.List;importjava.util.Map;importorg.apache.http.HttpResponse;importorg.apache.http.NameValuePair;importorg.apache.http.client.entity.UrlEncodedFormEntity;importorg.apache.http.client.methods.HttpPost;importorg.apache.http.impl.client.DefaultHttpClient;importorg.apache.http.message.BasicNameValuePair;tocol.HTTP;importorg.apache.http.util.EntityUtils;importandroid.util.Log;/*http请求发送器*/publicclassHttpRequester /*直接通过HTTP协议提交数据到服务器,实现如下面表单提交功能:*paramactionUrl上传路径(注:避免使用localhost或这样的路径测试,因为它会指向手机模拟器,你可以使用或0:8080这样的路径测试)*paramparams请求参数key为参数名,value为参数值*paramfile上传文件*/publicstaticString post(String actionUrl, Map params, FormFile files) tryString BOUNDARY =-7d 4a6d158c9;/数据分隔线String MULTIPART_FORM_DATA =multipart/form-data;URL url =newURL(actionUrl);HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setConnectTimeout(6* 1000);conn.setDoInput(true);/允许输入conn.setDoOutput(true);/允许输出conn.setUseCaches(false);/不使用Cacheconn.setRequestMethod(POST);conn.setRequestProperty(Connection,Keep-Alive);conn.setRequestProperty(Charset,UTF-8);conn.setRequestProperty(Content-Type, MULTIPART_FORM_DATA +; boundary=+ BOUNDARY);StringBuilder sb =newStringBuilder();for(Map.Entry entry : params.entrySet() /构建表单字段内容sb.append(-);sb.append(BOUNDARY);sb.append(rn);sb.append(Content-Disposition: form-data; name=+ entry.getKey() +rnrn);sb.append(entry.getValue();sb.append(rn);DataOutputStream outStream =newDataOutputStream(conn.getOutputStream();outStream.write(sb.toString().getBytes();/发送表单字段数据for(FormFile file : files)/发送文件数据StringBuilder split =newStringBuilder();split.append(-);split.append(BOUNDARY);split.append(rn);split.append(Content-Disposition: form-data;name=+ file.getFormname()+;filename=+ file.getFilname() +rn);split.append(Content-Type: + file.getContentType()+rnrn);outStream.write(split.toString().getBytes();if(file.getInStream()!=null)byte buffer =newbyte1024;intlen = 0;while(len = file.getInStream().read(buffer)!=-1)outStream.write(buffer, 0, len);file.getInStream().close();elseoutStream.write(file.getData(), 0, file.getData().length);outStream.write(rn.getBytes();byte end_data = (-+ BOUNDARY +-rn).getBytes();/数据结束标志outStream.write(end_data);outStream.flush();intcah = conn.getResponseCode();if(cah != 200)thrownewRuntimeException(请求url失败);InputStream is = conn.getInputStream();intch;StringBuilder b =newStringBuilder();while( (ch = is.read() != -1 )b.append(char)ch);Log.i(ItcastHttpPost, b.toString();outStream.close();conn.disconnect();returnb.toString();catch(Exception e) thrownewRuntimeException(e);/*提交数据到服务器*paramactionUrl上传路径(注:避免使用localhost或这样的路径测试,因为它会指向手机模拟器,你可以使用或0:8080这样的路径测试)*paramparams请求参数key为参数名,value为参数值*paramfile上传文件*/publicstat

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论