Android 的网络通信的小知识

网络通信机制

网络由下往上分为:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。IP协议对应于网络层,TCP协议对应于传输层,而HTTP协议对应于应用层,三者从本质上来说没有可比性,socket则是对TCP/IP协议的封装和应用。也可以说,TCP/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据。

TCP/IP协议

网络编程的目的就是直接或间接地通过网络协议与其他计算机进行通讯。

网络编程中有两个主要的问题,一个是如何准确的定位网络上一台或多台主机;另一个就是找到主机后如何可靠高效的进行数据传输。目前使用最广泛的因特网协议是TCP/IP协议。在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上的一台主机。而TCP层则提供面向应用的可靠的或非可靠的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层是如何处理数据的。

Socket

我们知道两个进程如果需要进行通讯最基本的一个前提能能够唯一的标示一个进程,在本地进程通讯中我们可以使用PID来唯一标示一个进程,但PID只在本地唯一,网络中的两个进程PID冲突几率很大,这时候我们需要另辟它径了,我们知道IP层的ip地址可以唯一标示主机,而TCP层协议和端口号可以唯一标示主机的一个进程,这样我们可以利用ip地址+协议+端口号唯一标示网络中的一个进程。能够唯一标示网络中的进程后,它们就可以利用socket进行通信了,什么是socket呢?我们经常把socket翻译为套接字,socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。Socket跟TCP/IP协议没有必然的联系。Socket编程接口在设计的时候,就希望也能适应其他的网络协议。所以说,Socket的出现只是使得程序员更方便地使用TCP/IP协议栈而已,是对TCP/IP协议的抽象,

Http协议

HTTP协议即超文本传送协议(Hypertext Transfer Protocol ),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用。HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。HTTP提供了封装或者显示数据的具体形式。Socket提供了网络通信的能力。

Https协议

HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。 它是一个URI scheme(抽象标识符体系),句法类同http:体系。用于安全的HTTP数据传输。https:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)。被广泛用于万维网上安全敏感的通讯,例如交易支付方面。

Android网络权限

<uses-permission android:name="android.permission.INTERNET" /><-- 允许应用程序打开网络套接字 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><-- 允许应用程序访问网络连接信息 -->

选择一个HTTP Client

大多数连接网络的 Android app 会使用 HTTP 来发送与接收数据。Android 提供了三种 HTTP client:HttpURLConnection、Apache HttpClient和okhttp。二者均支持 HTTPS、流媒体上传和下载、可配置的超时、IPv6 与连接池(connection pooling)。

  • Java.NET包中的HttpURLConnection类

  • HttpUrlConnection是JDK里提供的联网API,我们知道Android SDK是基于Java的,所以当然优先考虑HttpUrlConnection这种最原始最基本的API,其实大多数开源的联网框架基本上也是基于JDK的HttpUrlConnection进行的封装罢了

  • HttpClient

    HttpClient是开源组织Apache提供的Java请求网络框架,其最早是为了方便Java服务器开发而诞生的,是对JDK中的HttpUrlConnection各API进行了封装和简化,提高了性能并且降低了调用API的繁琐,Android因此也引进了这个联网框架,我们再不需要导入任何jar或者类库就可以直接使用,值得注意的是Android官方已经宣布不建议使用HttpClient了,在Api22中弃用了它,现在应该没有了。

  • okhttp

    http是现在主流应用使用的网络请求方式, 用来交换数据和内容, 有效的使用HTTP可以使你的APP变的更快和减少流量的使用。

    OkHttp是一个很棒HTTP客户端:

    • 支持SPDY,可以合并多个到同一个主机的请求

    • 使用连接池技术减少请求的延迟(如果SPDY是可用的话)

    • 使用GZIP压缩减少传输的数据量

    • 缓存响应避免重复的网络请求

    当你的网络出现拥挤的时候,就是OKHttp大显身手的时候,它可以避免常见的网络问题,如果你的服务是部署在不同的IP上面的,如果第一个连接失败,OkHTtp会尝试其他的连接。这对现在IPv4+IPv6中常见的把服务冗余部署在不同的数据中心上也是很有必要的。OkHttp将使用现在TLS特性(SNI ALPN)来初始化新的连接,如果握手失败,将切换到TLS 1.0。使用OkHttp很容易,同时支持异步阻塞请求和回调。如果你使用OkHttp ,你不用重写你的代码, okhttp-urlconnection模块实现了 java.net.HttpURLConnection 中的API, okhttp-apache模块实现了HttpClient中的API,但是最好使用OkhttpUtils(是okhttp进行封装的),网络请求更简单,方便。

还有很多三方的网络请求框架

1.volley

Volley 的中文翻译为“齐射、并发”,是在 2013 年的 Google 大会上发布的一款 Android 平台网络通信库,具有网络请求的处理、小图片的异步加载和缓存等功能,能够帮助 Android APP 更方便地执行网络操作,而且更快速高效。

优点: 
(1)自动调度网络请求; 
(2)高并发网络连接; 
(3)通过标准的 HTTP cache coherence(高速缓存一致性)缓存磁盘和内存透明的响应; 
(4)支持指定请求的优先级( 请求队列的优先级排序); 
(5) 提供多样的取消机制:网络请求 cancel 机制,我们可以取消单个请求,或者指定取消请求队列中的             一个区域; 
(6)框架容易被定制,例如,定制重试或者回退功能; 
(7)包含了调试与追踪工具; 
(8)默认 Android2.3 及以上基于 HttpURLConnection,2.3 以下使用基于 HttpClient 
(9)提供简便的图片加载工具(其实图片的加载才是我们最为看重的功能)

缺点: 
(1)不能下载文件:这也是它最致命的地方

官网或相关地址: 
  Volley 的 github 地址:https://github.com/mcxiaoke/android-volley; 
 Google I/O 2013 – Volley: Easy, Fast Networking for Android:                                                    https://www.youtube.com/watch?v=yhv8l9F44qo&feature=player_embedded 
 简单的使用:http://www.dengzhr.com/others/mobile/android/762

2.Android-async-http

Android-async-http 是一个强大的网络请求库,这个网络请求库是基于 Apache HttpClient 库之上的一个异步网络请求处理库,网络处理均基于 Android 的非 UI 线程,通过回调方法处理请求结果。 
android-async-http 是一个强大的第三方开源网络请求库。可惜的是 Android 6.0 (api 23) SDK,不再提供 org.apache.http.* (只保留几个类)。

优点: 
(1) 在匿名回调中处理请求结果 
(2) 在 UI 线程外进行 http 请求 
(3) 文件断点上传 
(4) 智能重试 
(5) 默认 gzip 压缩 
(6) 支持解析成 Json 格式 
(7) 可将 Cookies 持久化到 SharedPreference

官网或相关地址: 
Android-async-http 的 github 地址:https://github.com/loopj/android-async-http 
官网教程:http://loopj.com/android-async-http/

接下来我们来看下我们国人封装的两个框架 Afinal 框架和 xUtils ,这两个框架的功能非常的丰富,甚至提供了数据库的封装,这很符合我们国人开发的App,都是把一大堆的功能都集进去,那这么强大的网络框架是不是真的那么强大呢?通常我们都会这样想:功能越丰富的开源框架,那么它在单一的功能上,比如就网络框架这一部分,是不是就没有其他专一网络的框架好呢?

注:这个框架的作者已经停止更新了,因此现在就不推荐使用了

3.Afinal框架

Afinal 是一个 android 的 sqlite orm 和 ioc 框架。同时封装了android中的http框架,使其更加简单易用;使用 finalBitmap,无需考虑 bitmap 在 android 中加载的时候 oom 的问题和快速滑动的时候图片加载位置错位等问题。

Afinal的宗旨是简洁,快速。约定大于配置的方式。尽量一行代码完成所有事情。

Afinal主要是分四个模块: 
(1) 数据库模块:android 中的 orm 框架,使用了线程池对 sqlite 进行操作。 
(2) 注解模块:android 中的 ioc 框架,完全注解方式就可以进行UI绑定和事件绑定。无需 findViewById 和 setClickListener 等。其实它后面是使用反射来进行初始化的。 
(3) 网络模块:通过 httpclient 进行封装 http 数据请求,支持 ajax方式加载,支持下载、上传文件功能。 
(4) 图片缓存模块:通过 FinalBitmap,imageview 加载 bitmap 的时候无需考虑 bitmap 加载过程中出现的 oom 和 android 容器快速滑动时候出现的图片错位等现象。

官网或相关地址: 
Afinal框架 的 github 地址:https://github.com/yangfuhai/afinal

注:这个框架的作者已经停止更新了,因此现在就不推荐使用了

4.xUtils

xUtils跟Afinal是同类型的框架, 现在作者已经两三年前就没有进行更新了。

官网的简介: 
xUtils3 api 变化较多, 已转至 https://github.com/wyouflf/xUtils3 
xUtils 2.x 对 Android 6.0兼容不是很好, 请尽快升级至 xUtils3. 
xUtils 包含了很多实用的android工具。 
xUtils 支持大文件上传,更全面的http请求协议支持(10种谓词),拥有更加灵活的 ORM,更多的事件注解支持且不受混淆影响… 
xUitls 最低兼容android 2.2 (api level 8)

官网或相关地址: 
Afinal框架 的 github 地址:https://github.com/wyouflf/xUtils

注:这个框架的作者已经停止更新了,因此现在就不推荐使用了

上面网络框架其实就个人而已,就不推荐使用了,要不就是功能太过丰富,如果在主流的 app 中使用,对后期的维护, 代价就很大了。比如你发现你框架中不适合使用某个功能,需要替换这部分的框架,你就会发现,你整个项目都不出现这个框架的影子,对于后期维护的成本实在是太大了!

后面的几个网路框架(okhttp , retrofit)是目前较好的网络框架,在公司也发现,很多项目都是使用这几个网络框架的。这两个网络开源框架都是 square 公司提供的,在开源界中,有两家公司提供的网络框架是非常丰富的,一个是 square 和 Facebook ,真心感谢这两个公司。

5.OKHttp

OkHttp 是一个相对成熟的解决方案,据说 Android4.4 的源码中可以看到 HttpURLConnection 已经替换成 OkHttp 实现了。在 Android 6.0 中底层的源码已经使用了 OKHttp ,这个是可以确定的。

OkHttp 处理了很多网络疑难杂症:会从很多常用的连接问题中自动恢复。如果您的服务器配置了多个IP地址,当第一个 IP 连接失败的时候,OkHttp 会自动尝试下一个 IP。OkHttp 还处理了代理服务器问题和 SSL握手失败问题。

使用 OkHttp 无需重写您程序中的网络代码。OkHttp 实现了几乎和Java.NET.HttpURLConnection 一样的API。如果你用了 Apache HttpClient,则 OkHttp 也提供了一个对应的 okhttp-apache 模块。

官网或相关地址: 
OKHttp 的 github 地址:https://github.com/square/okhttp

6.retrofit

其实 retrofit 是根据 OKHttp 封装的框架,它的底层网络请求就是使用OKHttp的,这个框架的作者也是非常有名的,就是 Jake Wharton 。简直就是我的偶像啊!

优点: 
(1)支持 okhttp 
(2)注解处理,简化代码 
(3)支持上传和下载文件 
(4)支持自己更换解析方式 
(5)支持多种http请求库

官网或相关地址: 
OKHttp 的 github 地址:https://github.com/square/retrofit

二、选择开源框架的见解

1.学习的成本:对该框架学习的时间长短,文档是否齐全的考虑 
2.流行的程度:该开源框架是否流行,github 上 start 的个数,都是我们考量的标准 
3.是否还在维护:如果该框架没人维护了,随着技术的不断更新,都会出现大大小小的问题的 
4.代码的体积: 体积当然不能太大了 
5.代码的设计: 整体框架的设计

猜你喜欢

转载自my.oschina.net/u/2987490/blog/1486670