Android中的网络通信

本文详细介绍了HTTP协议的基础知识,包括请求/响应模型、无状态特性、关键组成部分如状态码和响应头等。此外还探讨了Android平台上使用HTTP协议的方法,涉及标准Java接口及Apache HttpClient的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[size=large]HTTP协议简介[/size]

HTTP协议:h t t p协议使We b服务器和浏览器可以通过We b交换数据。它是一种请求/响应协议,即服务器等待并响应客户方请求。H T T P不维护与客户方的连接,它使用可靠的T C P连接,通常采用TCP 80端口。
客户/服务器传输过程可分为四个基一步骤: 1) 浏览器与服务器建立连接; 2) 浏览器向服务器请求文档; 3) 服务器响应浏览器请求; 4) 断开连接。 注:H T T P是一种无状态协议,它不维护连接的状态信息。
客户请求客户请求包含以下信息:请求方法请求头请求数据
(1)请求方法是用于特定U R L或We b页面的程序
HTTP请求方法方法       描述GET     请求指定的文档HEAD    仅请求文档头POST    请求服务器接收指定文档作为可执行的信息PUT     用从客户端传送的数据取代指定文档中的内容DELETE  请求服务器删除指定页面OPTIONS 允许客户端查看服务器的性能TRACE   用于测试—允许客户端查看消息回收过程(2)头信息是可选项,它用于向服务器提供客户端的其他信息如果客户采用某种方法获取数据(如P O S T ),数据就放在头( h e a d e r )之后;否则客户机等待从服务器传来的响应。
2. 服务器响应服务器响应包括以下关键部分:状态码响应头响应数据
HTTP定义了多组返回给浏览器的状态码。
响应头向客户方提供服务器和/或请求文档的信息HTTP响应头方法              描述Server         Web服务器信息Date           当前日期/时间Last Modified  请求文档最近修改时间Expires        请求文档过期时间Content-length 数据长度(字节)Content-type   数据M I M E类型WWW-authenticate 用于通知客户方需要的认证信息(如用户名、口令等)如果有客户方请求的数据,数据放在响应头之后,否则服务器断开连接。
[size=large]HTTP中的几个重要概念[/size]

连接:Connection
一个传输层的实际环流,它是建立在两个相互通讯的应用程序之间。
在http1.1,request和reponse头中都有可能出现一个connection的头,此header的含义是当client和server通信时对于长链接如何进行处理。
在http1.1中,client和server都是默认对方支持长链接的, 如果client使用http1.1协议,但又不希望使用长链接,则需要在header中指明connection的值为close;如果server方也不想支持长链接,则在response中也需要明确说明connection的值为close。不论request还是response的header中包含了值为close的connection,都表明当前正在使用的tcp链接在当天请求处理完毕后会被断掉。以后client再进行新的请求时就必须创建新的tcp链接了。
消息:Message
HTTP通讯的基本单位,包括一个结构化的八元组序列并通过连接传输。
请求:Request
一个从客户端到服务器的请求信息包括应用于资源的方法、资源的标识符和协议的版本号。
响应:Response
一个从服务器返回的信息包括HTTP协议的版本号、请求的状态(例如“成功”或“没找到”)和文档的MIME类型。
实体:Entity
数据资源或来自服务资源的回映的一种特殊表示方法,它可能被包围在一个请求或响应信息中。一个实体包括实体头信息和实体的本身内容。
客户机:Client
一个为发送请求目的而建立连接的应用程序。
用户代理:UserAgent
初始化一个请求的客户机。它们是浏览器、编辑器或其它用户工具。
服务器:Server
一个接受连接并对请求返回信息的应用程序。
代理:Proxy
一个中间程序,它可以充当一个服务器,也可以充当一个客户机,为其它客户机建立请求。请求是通过可能的翻译在内部或经过传递到其它的服务器中。一个代理在发送请求信息之前,必须解释并且如果可能重写它。
代理经常作为通过防火墙的客户机端的门户,代理还可以作为一个帮助应用来通过协议处理没有被用户代理完成的请求。
网关:Gateway
一个作为其它服务器中间媒介的服务器。与代理不同的是,网关接受请求就好象对被请求的资源来说它就是源服务器;发出请求的客户机并没有意识到它在同网关打交道。
网关经常作为通过防火墙的服务器端的门户,网关还可以作为一个协议翻译器以便存取那些存储在非HTTP系统中的资源。
[size=large]Android使用HTTP协议[/size]

Android基于Linux内核。目前Android平台有3种网络接口可以使用,分别是:java.net.*(标准Java接口)、org.apache(Apache接口)和android.net.*(Android 网络接口)。
在客户端这块不管怎么操作都无外乎以下几个步骤
1.建立连接
2.初始化参数
3.得到输出流,使用输出流向服务器写数据
4.得到输入流,使用输入流从服务器读数据
5.关闭连接
[size=large]标准Java接口[/size]

Java.net.*(标准Java接口)提供与联网有关的类,包括流和数据包套接字、Internet协议、常见HTTP处理。比如:创建URL以及URLConnection/HttpURLConnection对象、设置连接参数、连接到服务器、向服务器写数据、从服务器读取数据等通信。
URLConnection类给应用程序和web资源之间架设起了通信的桥梁,这些web资源通常是通过url来标记的,比如http://www.baidu.com
HttpURLConnection是Java的标准类,继承自URLConnection类,URLConnection与HttpURLConnection都是抽象类,无法直接实例化对象,其对象主要通过URL的openConnection方法获得,创建一个HttpURLConnection连接的代码如下所示
URL url=new URL(pathUrl);
HttpURLConnection httpConn ; httpConn=(HttpURLConnection)url.openConnection();
创建完URLConnection或者HttpURLConnection实例后需要建立连接,同时在连接前需要设置一些属性,下面介绍一下HttpURLConnection实例的属性设置
httpConn.setDoOutput(true);//使用 URL 连接进行输出
httpConn.setDoInput(true);//使用 URL 连接进行输入
httpConn.setUseCaches(false);//忽略缓存
httpConn.setConnectTimeout(10000);//设置连接超时时间
httpConn.setRequestMethod("POST");//设置URL请求方法
… … … …
当这些属性设置完成后进行连接 httpConn.connect() ;
向服务器发送数据需要获得输出流
OutputStream os = connection.getOutputStream();
记得一定要flush()上去才能把数据发送出去。
如果要向服务器读取数据则需要获得输入流
InputStream in = connection.getInputStream()
最后关闭httpConn.disconnect();
[size=large]org.apache(Apache接口)[/size]

Apache HttpClient 是一个开源项目,弥补了 java.net.* 灵活性不足的缺点,为客户端的HTTP编程提供高效、最新、功能丰富的工具包支持。Android 平台引入了 Apache HttpClient 的同时还提供了对它的一些封装和扩展,例如设置缺省的HTTP超时和缓存大小等。
以下介绍如何使用Apache接口
Header Represents an HTTP header field. (代表HTTP头部区域)
HttpEntity An entity that can be sent or received with an HTTP message.( 一个能够发送并接受HTTP信息的实体)
HttpResponse An HTTP response. (一次HTTP响应 )
HttpStatus Constants enumerating the HTTP status codes.(HTTP状态信息)
HttpConnectionParams Connection params for HTTP (HTTP连接参数)
HttpPost HttpGet 请求方式
创建 HttpParams 以用来设置 HTTP 参数(按实际需要,不设置按照缺省值处理)
HttpParams params = new BasicHttpParams();
// 设置连接超时和 Socket 超时,以及 Socket 缓存大小
HttpConnectionParams.setConnectionTimeout(params, 20 * 1000);
HttpConnectionParams.setSoTimeout(params, 20 * 1000);
HttpConnectionParams.setSocketBufferSize(params, 8192);     
… … …
创建一个 HttpClient 实例   
HttpClient httpClient = new DefaultHttpClient(params);   
创建 HttpGet 方法,该方法会自动处理 URL 地址的重定向   
 HttpGet httpGet = new HttpGet ("http://www.baidu.com/");   
或者创建HttpPost方法
URI uri = URI.create(url);
httpPost = new HttpPost(uri);
httpPost.setEntity(reqEntity);
如果要向服务器发送数据需要向HttpPost实例添加实体(HttpEntity)
HttpEntity 这个实体可以传送或者接受HTTP信息
下面是一些HttpEntity的直接子类,具体传送数据的方式按照需求选择合适的HttpEntity
AbstractHttpEntity, BasicHttpEntity, BasicManagedEntity, BufferedHttpEntity, ByteArrayEntity, EntityTemplate, FileEntity, HttpEntityWrapper, InputStreamEntity, SerializableEntity, StringEntity, UrlEncodedFormEntity
以ByteArrayEntity 为例 
ByteArrayOutputStream os = new ByteArrayOutputStream();
ByteArrayEntity reqEntity = new ByteArrayEntity(os.toByteArray());
通过HttpClient将HttpPost请求发送给服务器,并且获得HttpResponse响应   
 HttpResponse response = httpClient.execute(httpPost);
//获取响应状态码
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
//获取HttpEntity
HttpEntity responseEntity = response.getEntity();
//得到输入流,获取从服务器端发送的数据
InputStream is = responseEntity.getContent();
最后关闭连接
httpClient.getConnectionManager().shutdown();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值