• Android HTTP通信

    Android 系统提供的网络编程方式基于 Java 语言,Java 语言提供的网络编程方式在 Andriod 中都提供了支持。

    具体的编程方式包括:针对 TCP/IP 协议的 Socket、ServerSocket 编程方式,针对 UDP 协议的 DatagramSocket、DatagramPackage 编程方式,针对直接网络 URL 访问的 URL、URLConnection 和 HttpURLConnection 方式,等等。首先我们来讲 HTTP 通信编程方式进行讲解。

    HTTP 英文全称为 Hyper Text Transfer Protocol,即超文本传输协议,是一种详细规定了浏览器和万维网(World Wide Web,WWW)服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。

    HTTP 协议采用请求/响应(Request/Response)模式,该工作模式单向、同步。在客户端向服务器发送请求之后,服务器返回结果之前,客户端只能等待。

    客户端向服务器发送一个请求,请求头包含请求的方法、URI、协议版本以及包含请求修饰符、客户信息和内容的类似于 MIME 的消息结构。

    服务器以一个状态行作为响应,响应的内容包括消息协议的版本、成功或者错误编码,还包含服务器信息、实体元信息以及可能的实体内容。它是一个属于应用层的面向对象的协议。

    由于其简洁、快速,因此适用于分布式超媒体信息系统。在 Internet 上,HTTP 通信通常发生在 TCP/IP 连接之上,缺省端口是 80,但其他的端口也是可用的。

    Android 是一种以 Linux 为基础的开放源码操作系统,在其内部包含一些用于实现 Android 网络数据操作的接口。

    Android 操作系统提供 3 种网络接口可供使用,它们分别是 Java 标准接口、Apache 接口和 Android 网络接口。其中,Java 标准接口是最常用的,而 Android 接口是 Java 标准接口的补充。

    接下来,我们将分别学习这些接口,分析并使用这些接口实现简单的网络操作。需要说明的是,在 Android 系统中开发 Internet 应用程序时,需要在 AndroidManifest.xml 文件中加入如下权限:

    <uses-permission android:name="android.permission.INTERNET" />

    1. 标准 Java 接口

    Android 提供了 java.net.* 包来实现访问 HTTP 服务的基本功能,其中包含一些非常实用的与网络操作相关的接口,包括流和数据包套接字、Internet 协议、常规 HTTP 处理等。

    HTTP 协议通过 URL(Uniform / Universal Resource Locator,统一资源定位符,也被称为网页地址)来定位资源。

    URL 是因特网上标准的资源的地址(Address)。

    URL 是用于完整地描述 Internet 上网页和其他资源的地址的一种标识方法。这种地址可以是本地磁盘,也可以是局域网上的某一台计算机,更多的是 Internet 上的站点。

    URL 由三部分组成:资源类型、存放资源的主机域名、资源文件名。

    URL 的一般语法格式为(带方括号“[]”的为可选项):

    protocol :// hostname[:port] / path / [;parameters][?query]#fragment

    其中的格式说明如下:

    1)protocol(协议)

    protocol 指定使用的传输协议,下表列出了常用的 protocol 属性的有效方案名称。最常用的是 HTTP 协议,它也是目前 WWW 中应用最广的协议。

    方案名称 描述内容
    file 资源是本地计算机上的文件,格式:file://
    ftp 通过 FTP 访问资源,格式:FTP://
    gopher 通过 Gopher 协议访问该资源,格式:gopher://
    http 通过 HHTP 协议访问该资源,格式:HTTP://
    https 通过安全的 HTTPS 访问该资源,格式:target=_blank>HTTPS://
    mailto 资源为电子邮件地址,通过 SMTP 访问,格式:moilto:
    MMS 通过支持 MMS(流媒体)协议播放该资源(代表软件:Windows Media Player),格式 MMS://
    ed2k 通过支持 ed2k(专用下载链接)协议 P2P 软件访问该资源(代表软件:电驴),格式 ed2k://
    Flashget 通过支持 Flashget:(专用下载链接)协议 P2P 软件访问该资源(代表软件:快车),格式 Flashget://
    thunder 通过支持 thunder(专用下载链接)协议 P2P 软件访问该资源(代表软件:迅雷),格式 thunder://
    news 通过 NNTP 访问该资源,格式:news://

    2) hostname(主机名)

    hostname 是指存放资源的服务器的域名系统(DNS)、主机名或 IP 地址。有时在主机名前也可以包含连接到服务器所需的用户名和密码(格式:username@password)。

    3)port(端口号)

    port 为整数,是可选的,省略时使用方案的默认端口,各种传输协议都有默认的端口号,如 HTTP 的默认端口为 80。

    若输入时省略,则使用默认端口号。有时出于安全或其他因素考虑,可以在服务器上对端口进行重定义,即采用非标准端口号,此时,URL 中就不能省略端口号这一项。

    4)path(路径)

    path 是由若干“/”符号隔开的字符串,一般用来表示主机上的一个目录或文件地址。

    5)parameters(参数)

    parameters 用于指定特殊参数的可选项。

    6)query(查询)

    query 也是可选项,用于给动态网页(如使用CGI、ISAPI、PHP/JSP/ASP/ASP.NET 等技术制作的网页)传递参数,可有多个参数,用“&”符号隔开,每个参数的名和值用“=”符号隔开。

    7)fragment(信息片断)

    fragment 是字符串,用于指定网络资源中的片断。例如一个网页中有多个名词解释,可使用 fragment 直接定位到某一名词解释。

    使用 Java 标准接口访问网络资源的基本步骤如下:

    1. 创建 URL。
    2. 从 URL 创建 URLConnection /HttpURLConnection 对象并设置连接参数。
    3. 连接到服务器。
    4. 读写服务器数据。

    Java.net.URL 类用于封装 URL 地址,可以通过该类与特定 URL 地址建立连接并对其中的数据进行读写操作。若封装的 URL 地址格式错误,则 URL 构造方法会抛出 MalformedURLException 异常。

    2. Apache接口

    Apache 实验室开源的包 org.apache.http.* 提供非常丰富的网络操作接口。弥补了 java.net.* 灵活性不足的缺点,对 java.net.* 进行封装,功能更加强大和全面,也会给 Android 带来更加丰富多彩的网络应用。

    在 Apache 网络接口中,最重要的是 HttpClient,HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的、支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。

    HttpClient 已经应用在很多项目中,比如 Apache Jakarta 上很著名的另外两个开源项目 Cactus 和 HTMLUnit 都使用了 HttpClient。它是一个开源项目,功能更加完善,为客户端的 HTTP 编程提供高效、最新、功能丰富的工具包支持。

    Android 平台引入了 Apache HttpClient 的同时还提供了对它的一些封装和扩展,例如设置缺省的 HTTP 超时和缓存大小等。

    Android 使用的是目前最新的 HttpClient 4.0(org.apache.http.*),可以将 Apache 视为目前流行的开源 Web 服务器,主要包括创建 HttpClient 以及 Get/Post、HttpRequest 等对象、设置连接参数、执行 HTTP 操作、处理服务器返回结果等功能。

    使用这部分接口的基本操作与 java.net.* 基本类似,主要包括:

    • 创建 HttpClient,以及 GetMethod / PostMethod 和 HttpRequest 等对象。
    • 设置连接参数。
    • 执行 HTTP 操作。
    • 处理服务器返回结果。

    以下列出的是 HttpClient 提供的主要功能。

    • 实现了所有 HTTP 的方法(GET、POST、PUT、HEAD 等)。
    • 支持自动转向。
    • 支持HTTPS协议。
    • 支持代理服务器。

    使用 HttpClient 时也需要注意请求报头和响应报头,以及提交方式,因为它也是遵循 HTTP 协议的。下面简单介绍一下常用的 GET 和 POST 方式在代码实现上有什么异同。

    在 GET 方式下使用 HttpClient 需要几个最基本的步骤:

    1. 构造 HttpClient 的实例。
    2. 创建连接方法的实例,这里是 HttpGet,在 HttpGet 的构造方法中传入待连接的路径。
    3. 请求 HttpClient,调用 execute 传入 HttPGet 取得 HttpResponse。
    4. 读 HttpResponse,在读之前判断连接状态是否等于 HttpStatus.SC_OK(200)。
    5. 对读取的内容进行处理。

    Post 方式相对 GET 有些差异并且复杂一点,主要是参数处理部分有差异。在 POST 方式下使用 HttpClient 需要几个最基本的步骤:

    1. 构造 HttpClient 的实例。
    2. 向 HttpPost 的构造参数中传入路径,创建 POST 连接。
    3. 准备参数,并且设置编码等相关信息。
    4. 将准备的参数设置到 HttpPost 中去,方法是 HttpPost.setEntity()。
    5. 得到 HttpResponse,通过 httpClient.execute() 得到。
    6. 读取 HttpResponse。
    7. 对读取的内容进行处理。

    需要注意的是,在网络操作过程中,需要 Android 应用拥有联网权限,可以在 AndroidManifest.xml 中写入 <uses-permission android:name="android.permission.INTERNET"/> 权限。

    3.Android 网络接口

    android.net.* 包实际上是通过对 Apache 中 HttpClient 的封装来实现的一个 HTTP 编程接口,同时还提供 HTTP 请求队列管理以及 HTTP 连接池管理,以提高并发送请求情况下的处理效率,

    除此之外,还有网络状态监视等接口、网络访问的 Socket、常用的 Uri 类以及有关 WiFi 相关的类等。

更多...

加载中...