android组件service可以使用http协议访问服务器.docx
- 文档编号:6166642
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:7
- 大小:19.56KB
android组件service可以使用http协议访问服务器.docx
《android组件service可以使用http协议访问服务器.docx》由会员分享,可在线阅读,更多相关《android组件service可以使用http协议访问服务器.docx(7页珍藏版)》请在冰豆网上搜索。
android组件service可以使用http协议访问服务器
竭诚为您提供优质文档/双击可除
android组件service可以使用http协议访问服务器
篇一:
android中使用http服务
在android中,除了使用包下的api访问http服务之外,我们还可以换一种途径去完成工作。
androidsdk附带了apache的httpclientapi。
apachehttpclient是一个完善的http客户端,它提供了对http协议的全面支持,可以使用httpget和post进行访问。
下面我们就结合实例,介绍一下httpclient的使用方法。
我们新建一个http项目,项目结构如图:
在这个项目中,我们不需要任何的activity,所有的操作都在单元测试类httptest.java中完成。
因为使用到了单元测试,所以在这里先介绍一下如何配置android中的单元测试。
所有配置信息均在androidmanifest.xml中完成:
[xhtml]viewplaincopy1.
2. 3.package="com.scott.http"
4.android:
versioncode="1"
5.android:
versionname="1.0">
6. app_name">
7.
8.
9.
10.
11. ner"
12.android:
targetpackage="com.scott.http"/>
13.
14.
15.
16.
然后,我们的单元测试类需要继承android.test.androidtestcase类,这个类本身是继承junit.framework.testcase,并提供了getcontext()方法,用于获取android上下文环境,这个设计非常有用,因为很多androidapi都是需要context才能完成的。
现在让我们来看一下我们的测试用例,httptest.java代码如下:
[java]viewplaincopy1.packagecom.scot.http.test;
2.
3.importjava.io.bytearrayoutputstream;
4.importjava.io.inputstream;
5.importjava.util.arraylist;
6.importjava.util.list;
7.
8.importjunit.framework.assert;
9.
10.importorg.apache.http.httpentity;
11.importorg.apache.http.httpResponse;
12.importorg.apache.http.httpstatus;
13.importorg.apache.http.nameValuepair;
14.importorg.apache.http.client.httpclient;
15.importorg.apache.http.client.entity.urlencodedFormentity;
16.importorg.apache.http.client.methods.httpget;
17.importorg.apache.http.client.methods.httppost;
18.importorg.apache.http.entity.mime.multipartentity;
19.importorg.apache.http.entity.mime.content.inputstreambody;
20.importorg.apache.http.entity.mime.content.stringbody;
21.importorg.apache.http.impl.client.defaulthttpclient;
22.importorg.apache.http.message.basicnameValuepair;
23.
24.importandroid.test.androidtestcase;
25.
26.publicclasshttptestextendsandroidtestcase{
27.
28.privatestaticfinalstringpath="http:
//192.168.1.57:
8080/web";
29.
30.publicvoidtestget()throwsexception{
31.httpclientclient=newdefaulthttpclient();
32.httpgetget=newhttpget(path+"/testservletid=1001
33.httpResponseresponse=client.execute(get);
34.if(response.getstatusline().getstatuscode()==httpstatus.sc_
ok){
35.inputstreamis=response.getentity().getcontent();
36.stringresult=instream2string(is);
37.assert.assertequals(result,"get_success");
38.}
39.}
40.
41.publicvoidtestpost()throwsexception{
42.httpclientclient=newdefaulthttpclient();
43.httppostpost=newhttppost(path+"/testservlet");
44.listparams=newarraylist();
45.params.add(newbasicnameValuepair("id","1001"));
46.params.add(newbasicnameValuepair("name","john"));
47.params.add(newbasicnameValuepair("age","60"));
48.httpentityformentity=newurlencodedFormentity(params);
49.post.setentity(formentity);
50.httpResponseresponse=client.execute(post);
51.if(response.getstatusline().getstatuscode()==httpstatus.sc_
ok){
52.inputstreamis=response.getentity().getcontent();
53.stringresult=instream2string(is);
54.assert.assertequals(result,"post_success");
55.}
56.}
57.
58.publicvoidtestupload()throwsexception{
59.inputstreamis=getcontext().getassets().open("books.xml");
60.httpclientclient=newdefaulthttpclient();
61.httppostpost=newhttppost(path+"/uploadservlet");
62.inputstreambodyisb=newinputstreambody(is,"books.xml");
63.multipartentitymultipartentity=newmultipartentity();
64.multipartentity.addpart("file",isb);
65.multipartentity.addpart("desc",newstringbody("thisisdescri
ption."));
66.post.setentity(multipartentity);
67.httpResponseresponse=client.execute(post);
68.if(response.getstatusline().getstatuscode()==httpstatus.sc_
ok){
69.is=response.getentity().getcontent();
70.stringresult=instream2string(is);
71.assert.assertequals(result,"upload_success");
72.}
73.}
74.
75.//将输入流转换成字符串
76.privatestringinstream2string(inputstreamis)throwsexception{
77.bytearrayoutputstreambaos=newbytearrayoutputstream();
78.byte[]buf=newbyte[1024];
79.intlen=-1;
80.while((len=is.read(buf))!
=-1){
81.baos.write(buf,0,len);
82.}
83.returnnewstring(baos.tobytearray());
84.}
85.}
因为此文件包含三个测试用例,所以我将会逐个介绍一下。
首先,需要注意的是,我们定位服务器地址时使用到了ip,因为这里不能用localhost,服务端是在windows上运行,而本单元测试运行在android平台,如果使用localhost就意味着在android内部去访问服务,可能是访问不到的,所以必须用ip来定位服务。
我们先来分析一下testget测试用例。
我们使用了httpget,请求参数直接附在uRl后面,然后由httpclient执行get请求,如果响应成功的话,取得响应内如输入流,并转换成字符串,最后判断是否为get_success。
testget测试对应服务端servlet代码如下:
[java]viewplaincopy
1.@override
2.protectedvoiddoget(httpservletRequestrequest,httpservletRespon
seresponse)throwsservletexception,ioexception{
3.system.out.println("dogetmethodiscalled.");
4.stringid=request.getparameter("id");
5.stringname=request.getparameter("name");
6.stringage=request.getparameter("age");
7.system.out.println("id:
"+id+",name:
"+name+",age:
"+
age);
8.response.getwriter().write("get_success");
9.}
然后再说testpost测试用例。
我们使用了httppost,uRl后面并没有附带参数信息,参数信息被包装成一个由nameValuepair类型组成的集合的形式,然后经过
urlencodedFormentity处理后调用httppost的setentity方法进行参数设置,最后由httpclient执行。
testpost测试对应的服务端代码如下:
[java]viewplaincopy
1.@override
2.protectedvoiddopost(httpservletRequestrequest,httpservletRespo
nseresponse)throwsservletexception,ioexception{
3.system.out.println("dopostmethodiscalled.");
4.stringid=request.getparameter("id");
5.stringname=request.getparameter("name");
6.stringage=request.getparameter("age");
7.system.out.println("id:
"+id+",name:
"+name+",age:
"
+
age);
8.response.getwriter().write("post_success");
9.}上面两个是最基本的get请求和post请求,参数都是文本数据类型,能满足普通的需求,不过在有的场合例如我们要用到上传文件的时候,就不能使用基本的get请求和post请求了,我们要使用多部件的post请求。
下面介绍一下如何使用多部件post操作上传一个文件到服务端。
由于android附带的httpclient版本暂不支持多部件post请求,所以我们需要用到一个httpmime开源项目,该组件是专门处理与mime类型有关的操作。
因为httpmime是包含在httpcomponents项目中的,所以我们需要去apache官方网站下载httpcomponents,然后把其中的httpmime.jar包放到项目中去,如图:
然后,我们观察testupload测试用例,我们用httpmime提供的inputstreambody处理文件流参数,用stringbody处理普通文本参数,最后把所有类型参数都加入到一个
multipartentity的实例中,并将这个multipartentity设置为此次post请求的参数实体,然后执行post请求。
服务端servlet代码如下:
[java]viewplaincopy
1.packagecom.scott.web.servlet;
2.
3.importjava.io.Fileoutputstream;
篇二:
android手机客户端与web服务器的通信
1.android手机访问web服务器
大多数中间件技术开发人员熟悉如何用计算机浏览器访问互联网,浏览器的主要作用是给互联网的web服务器提交数据、验证数据和解析显示数据。
其工作原理是通过http协议.提交数据用get或者post方法,客户端的数据通过浏览器网页提交给web应用服务器,应用服务器通过web页面接收各种不同类型数据,将数据通过服务器的servlet子类httpservlet对象提交给服务器端处理逻辑.服务器逻辑将接收到的数据按照客户端的要求在web服务器端进行运算,再将运算的结果返回给客户端浏览器进行解析和显示。
这里关键是web服务器端的servlet.它是服务器和客户端交互据的服务器端端口,即所有客户端的数据都要通过servlet提交给web服务器.所有要返回给客户端的数据都要通过web服务器端的servlet响应给客户端。
在实际应用的服务器端,创建servlet的子类对象httpservlet(httpservletRequest和httpservletResponse),分别用来接收客户端的数据和将数据返回给客户端。
现在的问题就在android手机终端.如何能够把客户的数据通过手机界面提交给web服务器android手机终端访问web服务器的技术架构是怎样的又如何能够在手机终端把web服务器响应的数据按照服务器的不同数据类型恢复原型这就是下面要解决的问题。
1.1手机客户端向web应用服务器发送请求信息
以实际开发的android手机终端登录功能为案例介绍如何利用sun公
司提供的java数据流和过滤流结合android提供的api提取web服务器端不同类型的数据。
1)首先引用所需要的各种api在android手机终端开发应用程序时.首先需要利用google和sun公司提供的必要类包(api),包括http通信协议类org.apache.http,*消息类org.apache.http.message.*数据流类java.io.*android.app.activity等。
2)定义访问网站的uRl
3)创建android程序界面类创建一个手机界面,需要继承android提供的activity,在该类中创建提交给web服务器的数据的httppost对象。
覆盖activity类的方法on—create(bundleb),创建事件监听器onclicklistener对象,在其中实现onclick(Viewv)方法,再把该事件监听器注册到相应的事件源loginbutton上。
4)创建httppost对象httppost对象的主要作用是将android手机端的数据提交给web应用服务器,为此android提供了很好的api.这里就利用android和sun公司提供的这些类把需要提交给服务器的数据(nameValuepair对象)保存到一个list对象中。
5)设置数据编码方式android手机在将准备好的数据发送到web服务器之前,需要对数据的编码进行规定,这样服务器在接收到这些数据后,就会根据发送过去的文字编码处理和显示。
6)提交httppost对象和获取服务器httpResponse响应数据完成
前面的工作,就该将数据提交给web应用服务器了,在应用服务接收android手机提交的数据后,经过处理,将要返回(响应)给android手机的数据打包到一个httpRe-sponse对象中,发回给手机。
到此。
android平台的通信任务已完成,即将web服务器相应过来的数据交给了httpResponse对象,剩下来的工作就是如何将web服务器响应过来的数据从httpResponse对象中取出。
1.2手机终端提取服务器端的响应数据
1)获取响应服务的数据从web服务器响应到手机终端的数据一般打包在一个字节数组中,关键是这个字节数组中可能包含了各种不同的数据类型,为此,需要采取java数据流和过滤流的方法从字节数据中取出各种类型的数据。
这是需要实现的关键技术。
到此手机终端从web服务器获取了所有类型的数据.剩下的任务就是将这些数据进一步交给android手机终端View组件,在手机界面上显示给用户。
2服务器端接收和响应android手机终端请求
在android手机终端发送请求后,接收请求的web服务器端会根据请求的数据信息进行运算,然后把运算结果响应给手机客户端。
下面介绍web服务器如何实现这一过程的。
2.1采用http的post方法接收数据
1)引用所需api在web端开发应用程序时,首先需要利用sun公司提供的必要类包(api),包括数据流类java.io.*交互界面类java.util.*数据通信端口类javax.servlet.*通信协议类javax.servlet.http.用spring架构通过xml文件注入数据对象类org.springfamework.web.context.*org.springframe-work.web.context.support.*service.customerserviee等。
2)创建servlet类数据端口
创建servlet对象就是创建了web应用服务器和连接互联网上所用客户端通信设备的数据接收和发送端口。
3)访问持久层检索数据
这里应用已经完善的spring管理事务的对象方法来获取持久层的数据。
4)创建输出流数据流对象这里创建的输出流对象主要是把响应的数据发送到手机端,由于可能是不同类型的数据,所以采(android组件service可以使用http协议访问服务器)用dataoutputstream对象来处理,用输出过滤流对象将不同类型的数据返回手机终端。
2.2配置服务器端组件集成文件(xml)
web应用服务器端用到的是ssh架构技术,服务器的业务逻辑已经成熟,只需要将spring的业务通过前述的servlet进行封装.就可以
将所有的spring管理的事物业务通过servlet和android手机进行交互,方法是在spring的applicationcontext.xm文件中增加相应的的配置即可,这样服务器响应给手机终端的数据处理部分完毕,一次交互过程完成。
篇三:
androidhttps服务器端和客户端简单实例
androidhttps服务器端和客户端简单实例
工具介绍
eclipse3.7
tomcat6.0.18(免安装版)
android2.1开发环境(在eclipse中配置好)
前提条件
jdk环境要使用我们自己安装的,笔者jdk安装目录为d:
\java\jdk1.6.0_22,在eclipse的window-preference-installedjRes中,只选用我们自己安装的jRe,如图所示:
在eclipse与tomcat整合的时候,也需要选择此运行环境:
一.搭建服务器端
1.在eclipse中新建dynamicwebproject,取名为httpsserver:
2.index.jsp内容如下:
stringpath=request.getcontextpath();
stringbasepath=request.getscheme()+":
//"
+request.getservername()+":
"+request.getserverport()
+path+"/";
%>
">
name+agejsppage
name:
age:
name:
age:
name="age"type="text"/>
这里其实是复用了之前http调研的代码,我们关心的是我们手机端能不能访问该服务器端,还涉及到传递数据,具体数据显示在testservice表示。
3.testservice代码如下:
packagecom.veer;
importjava.io.ioexception;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- android 组件 service 可以 使用 http 协议 访问 服务器
![提示](https://static.bdocx.com/images/bang_tan.gif)