转载请标明出处:http://blog.csdn.net/u012637501
一、Android客户端与服务器交互
1.HTTP协议简介
HTTP协议即
超文本传输协议(
Hypertext Transfer Protocol),是建立在
TCP协议之上的一种应用,它是基于
请求/响应的通信协议,每次连接只做一次请求/响应,服务器响应客户端请求后,就不会记录客户端的信息,更
不会维护客户端的状态,因此HTTP又称为
无状态的通信协议。
由于HTTP在每次请求结束后都会主动释放连接,因此HTTP连接是一种
"短连接"、
"无状态",要保持客户端程序的在线状态,需要
不断地向服务器发起连接请求。通常的做法是即使不需要获得任何数据,客户端也保持
每隔一段固定的时间向服务器发送一次"保持连接"的请求,服务器在收到该请求后对客户端进行回复,表明知道客户端"在线"。若服务器长时间无法收到客户端的请求,则认为客户端"
下线",若客户端长时间无法收到服务器的回复,则认为
网络已经断开。
2.HTTP协议特点
(1)简单快速
客户端向服务器请求服务时,只需
传送请求方法和路径。
请求方法常用的有
GET、HEAD、POST等,
每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,因而通信速度很快。
(2)灵活
HTTP允许
传输任何类型的数据对象。正在传输的类型由
Content-Type加以标记。
(3)无连接
无连接的含义是限制
每次连接只
处理一个请求。服务器处理完客户的请求并收到客户的应答后,即
断开连接。采用这种方式,可以
节省传输时间。
(4)无状态
HTTP协议是
无状态协议。无状态是指
协议对于事物处理没有记忆能力,缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另外,在服务器不需要先前信息时,它的应答就较快。
3.GET和POST的区别
(1)传递数据形式
◆GET请求方法:是
将需要传递的数据按照
"键=值"对的形式,
添加到URL的后面,并且
两者使用"?"连接,而
多个变量之间使用“&”连接;
◆POST请求方法:是将传递的数据放在请求的数据体,不会在URL中显示。
(2)安全性
◆GET请求方法:
GET是不安全的,因为在传输过程,数据被放在请求的URL中,而如今现有的很多服务器、代理服务器或者用户代理都会将请求URL存放至
日志文件中,然后放在某个地方,这样就可能会有一些
隐私的信息被第三方看到。另外,用户也可以在浏览器上直接看到提交的数据,一些系统内部消息将会一同显示在用户面前;
◆POST请求方法:Post的所有操作
对用户来说都是不可见的,因此安全性较高。
(3)传输性能
◆GET传输的
数据量小,这主要是因为
受URL长度受限制;
◆POST可以
传输大量的数据,所以在上传文件只能使用POST。
4.Apache HttpClient API
(1)
HttpClient:该类是
HTTP客户端的接口,该接口
封装
了
执行Http请求
所需要的各种对象,这些对象可以处理cookie、授权、连接管理以及其他一些特性。HttpClient的线程安全依赖于具体的客户端的实现和配置。
(2)
HttpGet:该类
采用GET方式
发送
HTTP请求,通常将请求的URL作为参数
传给该类的构造方法;
(3)
HttpPost:该类采
用POST方式
发送
HTTP请求,通常将请求的
URL作为参数传给该类的构造方法;
(4)
HttpResponse:该接口
封装了HTTP的响应信息,通过调用相应方法可以
获取HTTP响应信息,例如获取响应状态、响应内容等。
(5)
HttpEntity:该类
封装了HTTP信息,通过该类可以获取
HTTP请求或
响应的内容、长度、类型、编码方式等信息,
HttpEntity对象可以通过Http消息发送和接收,既可以存在于请求消息中,也可以存在于响应消息中。
二、使用HttpClient访问Http资源步骤
1.创建HttpGet或HttpPost对象,将需请求的URL通过构造方法传入HttpGet或HttpPost对象;
2.使用DefaultHttpClient类的execute()方法发送HTTP GET或HTTP POST请求,并返回HttpResponse对象;
3.通过
HttpResponse接口的
getEntity()方法
返回响应信息(
HttpEntity对像,其内为接收的响应信息
),并进行相应处理。
注意:如果使用Http提交HTTP POST请求,还需要使用HttpPost类的setEntity()方法设置请求参数。
→HttpClient执行过程(GET请求)
①创建
HttpClient对象,表示客户端对象;
②根据URL创建
HttpGet对象,其内容包含一个Get请求;
③调用客户端对象的execute(HttpGet对象),将HttpGet对象包含的Get请求传送给服务器,
返回一个
HttpResponse对象(包含服务器的响应信息)
④调用HttpResponse对象的getEntity()方法,
将
其包含的响应信息封装到实体HttpEntity对象中;
⑤调用HttpEntity实体的getContent()方法,获得响应信息的输入流,最后读取输入流中的内容并以字符串的形式返回。
→HttpClient执行过程(POST请求)
(1)准备Post请求实体
HttpClient httpClient=new DefaultClient(); //①创建客户端对象
String url="http://baidu.com"; //②指定请求路径URL
NameValuePair pair1=new BasicNameValuePair("键1",值1); //③创建参数列表(传递的数据)
NameValuePair pair2=new BasicNameValuePair("键2",值2) //每个参数以键值对的形式保存在NameValuePair中
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(pair1);
params.add(pair2);
HttpEntity httpEntity=new UrlEncodedFormEntity(params,"gbk");//④根据参数创建封装发送信息的HttpEntity对象
HttpPost httpPost=new HttpPost(url); //⑤将HttpEntity对象赋值给HttpPost对象(Post请求信息实体)
httpPost.setEntity(httpEntity);
(2)调用客户端对象execute()方法发送Post请求,并同时获得服务器响应信息(HttpResponse)
HttpReponse httpResponse=httpClient.execute(httpPost);
(3)从HttpResponse对象中获取封装了响应信息的HttpEntity对象,并获取对应的输入流;
HttpEntity httpEntity=httpResponse.getEntity(); //获取响应信息实体
InputStream is=httpEntity.getContent(); //获取实体中响应信息对应的输入流
三、Tomcat服务器
1.Tomcat服务器简介
Tomcat是一个
免费的、开源的web应用服务器,它是一个
轻量级应用服务器。在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试Java web程序的首选。
2.安装和使用中需注意
(1)
设置Tomcat的端口号:默认情况下,该端口为8080,如果需要设置,最好选一个1024以上的端口号。1024以内的端口大部分都被系统所用,以避免端口冲突;
(2)
设置Tomcat管理员账户和密码,管理应用时需要登录;
(3)
启动Tomcat:直接双击Tomcat安装路径下的bin路径的tomcat6.exe即可。重复启动Tomcat,控制台将会报错并直接退出,因为第二次启动时,端口已经被占用,必须关闭之前的Tomcat,才能启动。
3.在Tomcat中部署Java Web应用
(1)Java Web部署
Java Web部署方式有多种,使用Tomcat安装目录下的
conf文件夹下的
Server.xml文件进行部署。在该文件的倒数第四行即</host>标签之上,添加如下代码。
◆
path:
虚拟路径,启动Tomcat后,可通过 http://localhost:8080/login/来访问该项目中的相关页面;
◆
docBase:项目根目录所在路径,是本机上的一个绝对路径,即Java Web应用所存放的位置,需要定位到WebRoot目录下;
◆
reloadable:设置为"true",表示修改Servlet文件后,不需要重启服务器就可以实现页面的同步更新。
(2)服务器处理和响应流程
当客户端发送 http://localhost:8080/login/LoginServlet请求时,服务器是如何处理和响应的呢?
第一步:根据Tomcat的
Server.xml文件,
查看login虚拟路径所对应的物理路径,即docBase所对应的值;
第二步:找到该物理路径下的
web.xml文件,找到包含
<url-pattern> /LoginServlet</url- pattern>的<Servlet-mapping>;
第三步:根据
<servlet-name>LoginServlet</servlet-name>找到对应的<servlet-class>的值,获取类名iet.jxufe.cn.server.LoginServlet ;
第四步:根据反射机制,创建
iet.jxufe.cn.server.LoginServlet类对象,并执行相应的方法,在方法处理中,会返回相应的处理结果。最后将结果返回给客户端。
(3)注意事项
◆Tomcat已启动,并且Java Web程序已部署到Tomcat服务器中;
◆客户端访问服务端的URL要正确,在此为 http://10.0.2.2:8080/login/LoginServlet而不是Java Web中的 http://localhost:8080/login/LoginServlet。因为模拟机通过127.0.0.1访问的是模拟器本身。在模拟器上访问安装模拟器的电脑,需要使用android内置的IP:10.0.2.2。10.0.2.2 是模拟器设置的特定ip,是你的电脑的别名,如果是网络服务器,可直接写相应的IP或网址;
◆需要在清单文件中添加访问网络的权限;
◆不能直接访问网络,需进行相应处理,建议采用消息传递机制;
四、Servlet中间件
1.Servlet简介
Servlet(Server+let)是在
服务器上运行的小程序,具有独立于平台和协议的特性,
可以生成动态的web页面,用于处理及响应客户端的请求,担当客户请求(web浏览器或其他HTTP客户程序)与服务器响应(HTTP服务器上的数据库或应用程序)的
中间层。
2.Servlet类
Servlet实质上是个特殊的Java类,该类继承于Servley或其子类(如
HttpServlet),Servlet用于处理和响应客户端的请求,
Servlet提供了不同的方法用于响应客户端请求。通常客户端的请求只有GET和POST两种,Servlet为了响应这两种请求,只需
重写doGet()和doPost()两个方法即可。
3.Servlet处理和响应客户端请求的过程
(1)客户端
发送请求至服务器端;
(2)
服务器将请求信息发送至Servlet;
(3)Servlet
生成响应内容并将其传给服务器,响应内容动态生成,通常取决于客户端的请求;
(4)服务器将响应结果以指定的形式返回给客户端。
4.MyEclipse中创建Servlet的配置
注意:Mapping URL设置的值为访问该Servlet的URL路径。