4.2 网络通讯

  • 网络基础协议

   

TPC/IP协议是传输层协议,主要解决数据如何在网络中传输。java

HTTP是应用层协议,主要解决如何包装数据。程序员

  关于TCP/IP和HTTP协议的关系,网络有一段比较容易理解的介绍:“咱们在传输数据时,能够只使用(传输层)TCP/IP协议,可是那样的话,若是没有应用层,便没法识别数据内容,若是想要使传输的数据有意义,则必须使用到应用层协议,应用层协议有不少,好比HTTP、FTP、TELNET等,也能够本身定义应用层协议。WEB使用HTTP协议做应用层协议,以封装HTTP文本信息,而后使用TCP/IP作传输层协议将它发到网络上。”web

 TCP创建链接和断开链接的过程简析:chrome

   

  创建链接:首先Client端发送链接请求报文,Server段接受链接后回复ACK报文,并为此次链接分配资源。Client端接收到ACK报文后也向Server段发生ACK报文,并分配资源,这样TCP链接就创建了。apache

  中断链接:能够是Client端,也能够是Server端。假设Client端发起中断链接请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",可是若是你还有数据没有发送完成,则没必要急着关闭Socket,能够继续发送数据。因此你先发送ACK,"告诉Client端,你的请求我收到了,可是我还没准备好,请继续你等个人消息"。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端肯定数据已发送完成,则向Client端发送FIN报文,"告诉Client端,好了,我这边数据发完了,准备好关闭链接了"。Client端收到FIN报文后,"就知道能够关闭链接了,可是他仍是不相信网络,怕Server端不知道要关闭,因此发送ACK后进入TIME_WAIT状态,若是Server端没有收到ACK则能够重传。“,Server端收到ACK后,"就知道能够断开链接了"。Client端等待了2MSL后依然没有收到回复,则证实Server端已正常关闭,那好,我Client端也能够关闭链接了。Ok!编程

  •  Android中几种网络通讯的手段

 1)针对TCP/IPSocketServerSocket浏览器

TCP/IP是一种面向链接的、可靠的协议。Socket仅仅是对TCP、UDP网络接口的封装,不涉及上层协议。TCP、UDP传输特性不一样,分别适用于不一样类型的应用层协议,其中TCP有链接,延时较长,能保证服务质量;UDP无链接,须要应用程序进行数据分包、延时短,效率高,数据包可能丢失或到达对端发生顺序混乱。在Socket之上能够实现这些RFC标准的应用层协议,也能够自定义实现私有的应用层协议。服务器

2)针对UDPDatagramSocketDatagramPackage网络

  这里须要注意的是,考虑到Android设备一般是手持终端,IP都是随着上网进行分配的。不是固定的。所以开发也是有一点与普通互联网应用有所差别的。异步

  1. 对于UDP服务端,首先启动侦听服务,而后获得数据包进行处理,组后根据得到数据包进行反馈。
  2. UDP socket没有链接的概念,所以构造完成的DatagramSocket不会发出向对端的网络链接请求,在每个发送的UDP数据包中包含目的地址和端口。由于UDP数据不会在对端进行从新组包,所以一次发送的数据长度必须加以限制

 3)针对直接URLHttpURLConnection

  apache httpclient高效稳定,可是维护成本高昂,故Android 开发团队不肯意在维护该库而是转投更为轻便的httpurlconnection;httpurlconnection比较轻便,灵活和易于扩展。

  HttpURLConnection的connect()函数,实际上只是创建了一个与服务器的tcp链接,并无实际发送http请求。不管是post仍是get,http请求实际上直到HttpURLConnection的getInputStream()这个函数里面才正式发送出去。

  在用POST方式发送URL请求时,URL请求参数的设定顺序是重中之重,对connection对象的一切配置(那一堆set函数)都必需要在connect()函数执行以前完成。而对outputStream的写操做,又必需要在inputStream的读操做以前。 这些顺序其实是由http请求的格式决定的。若是inputStream读操做在outputStream的写操做以前,会抛出: java.net.ProtocolException: Cannot write output after reading input.......

  http请求实际上由两部分组成, 一个是http,全部关于这次http请求的配置都在http头里面定义, 一个是正文content。connect()函数会根据HttpURLConnection对象的配置值生成http头部信息,所以在调用connect函数以前,就必须把全部的配置准备好。在http头后面紧跟着的是http请求的正文,正文的内容是经过outputStream流写入的,实际上outputStream不是一个网络流,充其量是个字符串流,往里面写入的东西不会当即发送到网络,而是存在于内存缓冲区中,待outputStream流关闭时,根据输入的内容生成http正文至此,http请求的东西已经所有准备就绪。

  在getInputStream()函数调用的时候,就会把准备好的http请求正式发送到服务器了,而后返回一个输入流,用于读取服务器对于这次http请求的返回信息。因为http请求在getInputStream的时候已经发送出去了(包括http头和正文),所以在getInputStream()函数以后对connection对象进行设置(对http头的信息进行修改)或者写入outputStream(对正文进行修改)都是没有意义的了,执行这些操做会致使异常的发生。

4使用Web Service。Android能够经过开源包如jackson去支持Xmlrpc和Jsonrpc,另外也能够用Ksoap2去实现Webservice 。它是一种基于SAOP协议的远程调用标准,经过webservice能够将不一样操做系统平台,不一样语言,不一样技术整合到一块儿。在Android中,第三方公司提供了基于webservice的jar包。

(5)直接使用WebView视图组件显示网页。基于WebView 进行开发,Google已经提供了一个基于chrome-lite的Web浏览器,直接就能够进行上网浏览网页。

理解Socket

  实际上socket是对TCP/IP协议的封装,Socket自己并非协议,而是一个调用接口(API),经过Socket,咱们才能使用TCP/IP协议。实际上,Socket跟TCP/IP协议没有必然的联系。Socket编程接口在设计的时候,就但愿也能适应其余的网络协议。因此说,Socket的出现只是使得程序员更方便地使用TCP/IP协议栈而已,是对TCP/IP协议的抽象,从而造成了咱们知道的一些最基本的函数接口,好比create、listen、connect、accept、send、read和write等等。网络有一段关于socket和TCP/IP协议关系的说法比较容易理 解:“TCP/IP只是一个协议栈,就像操做系统的运行机制同样,必需要具体实现,同时也要提供可供程序员作网络开发所用的接口,这就是Socket编程接口。”

理解断点续传

断点续传是HTTP 1.1协议的一部分,并不须要客户端特地去作多么复杂的事情。

只要利用了HTTP协议中的以下字段来和服务器端交互,就能够实现文件下载的断点续传:

Range:用于客户端到服务器端的请求,可经过该字段指定下载文件的某一段大小,及其单位。典型的格式如:

  • Range: bytes=0-499      下载第0-499字节范围的内容
  • Range: bytes=500-999  下载第500-999字节范围的内容
  • Range: bytes=-500       下载最后500字节的内容
  • Range: bytes=500-       下载从第500字节开始到文件结束部分的内容(这是最经常使用的一种格式)
  • Range: bytes=0-0,-1     下载第一以及最后一个字节的内容(这个看上去有点变态...)

Accept-Ranges:用于服务器端到客户端的应答,客户端经过该字段能够判断服务器是否支持断点续传(可选字段)。格式以下:Accept-Ranges: bytes  //表示支持以bytes为单位进行传输;  如果 none  表示不支持

Content-Ranges:用于服务器端到客户端的应答,与Accept-Ranges在同一个报文内,经过该字段指定了返回的文件资源的字节范围。格式以下:

  • Content-Ranges: bytes 0-499/1234             大小为1234的文件的第0-499字节范围的内容
  • Content-Ranges: bytes 734-1233/1234        大小为1234字节的文件的第734-结尾范围的内容

据此咱们能够知道,断点续传这个功能是须要客户端和服务器端同时支持才能完成

  Android平台面向开发者提供了DownloadManager这个服务(service),能够用来完成下载,同时异步地获得下载进度的实时更新提示。该接口也部分的提供了断点续传功能:若是在下载过程当中遇到网络错误,如信号中断等,DownloadManager会在网络恢复时尝试断点续传继续下载该文件。但不支持由用户发起的暂停而后断点续传。要扩展该功能也不难,只要为下载任务新增一种状态(相似paused_by_user),以及相关逻辑便可。

【附】服务端和客户端交互使用了两种方式:XML、JSON

相关文章
相关标签/搜索