第七章--Android网络通信.ppt
《第七章--Android网络通信.ppt》由会员分享,可在线阅读,更多相关《第七章--Android网络通信.ppt(77页珍藏版)》请在冰豆网上搜索。
第七章Android网络通信,第七章Android网络通信,第七章Android网络通信,本章内容,Android平台网络通信AndroidHttp通信AndroidSocket通信AndroidSSL通信蓝牙WIFI,第七章Android网络通信,Android网络通信,AndroidSDK中一些与网络有关的包如下所示:
第七章Android网络通信,Android平台网络通信,Android与服务器通信的方式一般有两种:
http通信方式:
httpURLConnetction接口、apache的接口httpClient接口。
http通信也分为post方式和get方式。
socket通信方式,第七章Android网络通信,Tcp连接,要想明白Socket连接,先要明白TCP连接。
手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接。
TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在“无差别”的网络之上。
建立起一个TCP连接需要经过“三次握手”:
第一次握手:
客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;第二次握手:
服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;第三次握手:
客户端收到服务器的SYNACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
第七章Android网络通信,HTTP连接,HTTP协议即超文本传送协议(HypertextTransferProtocol),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用。
HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。
从建立连接到关闭连接的过程称为“一次连接”。
1)在HTTP1.0中,客户端的每次请求都要求建立一次单独的连接,在处理完本次请求后,就自动释放连接。
2)在HTTP1.1中则可以在一次连接中处理多个请求,并且多个请求可以重叠进行,不需要等待一个请求结束后再发送下一个请求。
由于HTTP在每次请求结束后都会主动释放连接,因此HTTP连接是一种“短连接”、“无状态”,要保持客户端程序的在线状态,需要不断地向服务器发起连接请求。
通常的做法是即使不需要获得任何数据,客户端也保持每隔一段固定的时间向服务器发送一次“保持连接”的请求,服务器在收到该请求后对客户端进行回复,表明知道客户端“在线”。
若服务器长时间无法收到客户端的请求,则认为客户端“下线”,若客户端长时间无法收到服务器的回复,则认为网络已经断开。
第七章Android网络通信,AndroidHTTP通信Http的工作方式,HTTP协议采用了请求/响应的工作方式。
基于HTTP1.0协议的客户端在每次向服务器发出请求后,服务器就会向客户端返回响应消息(包括请求是否正确以及所请求的数据),在确认客户端已经收到响应消息后,服务端就会关闭网络连接。
在这个数据传输过程中,并不保存任何历史信息和状态信息,因此,HTTP协议也被认为是无状态的协议。
HTTP1.0通讯过程如图所示:
第七章Android网络通信,AndroidHTTP通信Http的工作方式,HTTP1.1和HTTP1.0相比较而言,最大的区别就是增加了持久连接支持。
当客户端使用HTTP1.1协议连接到服务器后,服务器就将关闭客户端连接的主动权交还给客户端;也就是说,在客户端向服务器发送一个请求并接收以一个响应后,只要不调用Socket类的close方法关闭网络连接,就可以继续向服务器发送HTTP请求。
HTTP1.1通讯过程如图所示:
第七章Android网络通信,SOCKET连接,套接字(socket)概念套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。
它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息(全相关):
连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。
应用层通过传输层进行数据通信时,TCP会遇到同时为多个应用程序进程提供并发服务的问题。
多个TCP连接或多个应用程序进程可能需要通过同一个TCP协议端口传输数据。
为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCPIP协议交互提供了套接字(Socket)接口。
应用层可以和传输层通过Socket接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。
建立socket连接建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket,另一个运行于服务器端,称为ServerSocket。
第七章Android网络通信,SOCKET连接,套接字之间的连接过程分为三个步骤:
服务器监听,客户端请求,连接确认。
服务器监听:
服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。
客户端请求:
指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。
为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
连接确认:
当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,双方就正式建立连接。
而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。
第七章Android网络通信,SOCKET连接与TCP连接,创建Socket连接时,可以指定使用的传输层协议,Socket可以支持不同的传输层协议(TCP或UDP),当使用TCP协议进行连接时,该Socket连接就是一个TCP连接。
第七章Android网络通信,HTTP连接,HTTP连接使用的是“请求响应”的方式(2次握手),不仅在请求时需要先建立连接,而且需要客户端向服务器发出请求后,服务器端才能回复数据。
第七章Android网络通信,AndroidHTTP通信什么是Http协议,HTTP协议是一种应用层协议,HTTP是HyperTextTransferProtocol(超文本传输协议)的英文缩写。
HTTP可以通过传输层的TCP协议在客户端和服务器之间传输数据。
HTTP协议主要用于Web浏览器和Web服务器之间的数据交换。
我们在使用IE或Firefox浏览网页或下载Web资源时,通过在地址栏中输入http:
/host:
port/path,开头的4个字母http就相当于通知浏览器使用HTTP协议来和host所确定的服务器进行通讯。
HTTP协议诞生于上世纪90年代初;第一个被广泛使用的版本是HTTP0.9。
在随后的HTTP1.0中,增加了很多在HTTP0.9中没有的特性;在最新的HTTP1.1中,对HTTP1.0做了更进一步的改进;HTTP1.1将是HTTP协议的最后一个版本。
想深入了解HTTP协议,请查看RFC2616或通过www.w3c.org来了解HTTP协议的详情。
第七章Android网络通信,AndroidHTTP通信Http1.1,HTTP1.1除了支持持久连接外,还将HTTP1.0的请求方法从原来的三个(GET、POST和HEAD)扩展到了八个(OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE和CONNECT)。
而且还增加了很多请求和响应字段,如上述的持久连接的字段Connection。
这个字段有两个值,Close和Keep-Alive。
如果使用Connection:
Close,则关闭HTTP1.1的持久连接的功能,要打开HTTP1.1的持久连接的功能,必须使用Connection:
Keep-Alive,或者不加Connection字段(因为HTTP1.1在默认情况下就是持久连接的)。
除了这些,还提供了身份认证、状态管理和缓存(Cache)等相关的请求头和响应头。
第七章Android网络通信,AndroidHTTP通信Http协议的特点,1.支持客户/服务器模式;2.简单快速:
客户向服务器请求服务时,只需传送请求方法和路径。
请求方法常用的有GET、HEAD、POST。
每种方法规定了客户与服务器联系的类型不同。
由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快;3.灵活:
HTTP允许传输任意类型的数据对象。
正在传输的类型由Content-Type加以标记;4.无状态:
HTTP协议是无状态协议。
无状态是指协议对于事务处理没有记忆能力。
缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。
另一方面,在服务器不需要先前信息时它的应答就较快;,第七章Android网络通信,AndroidHTTP通信Http协议详解,http:
/host:
portabs_pathhttp表示要通过HTTP协议来定位网络资源;host表示合法的Internet主机域名或者IP地址;port指定一个端口号,为空则使用缺省端口80;abs_path指定请求资源的URI;如果URL中没有给出abs_path,那么当它作为请求URI时,必须以“/”的形式给出,通常这个工作浏览器自动帮我们完成。
例如:
1、输入:
浏览器自动转换成:
http:
/请求由三部分组成:
请求行、消息报头、请求正文。
1)请求行:
MethodRequest-URIHTTP-VersionCRLF其中Method表示请求方法;Request-URI是一个统一资源标识符;HTTP-Version表示请求的HTTP协议版本;CRLF表示回车和换。
第七章Android网络通信,AndroidHTTP通信Http协议请求方法,请求方法(所有方法全为大写)有多种,各个方法的解释如下:
GET请求获取Request-URI所标识的资源;POST在Request-URI所标识的资源后附加新的数据;HEAD请求获取由Request-URI所标识的资源的响应消息报头;PUT请求服务器存储一个资源,并用Request-URI作为其标识;DELETE请求服务器删除Request-URI所标识的资源;TRACE请求服务器回送收到的请求信息,主要用于测试或诊断;CONNECT保留将来使用;OPTIONS请求查询服务器的性能,或者查询与资源相关的选项和需求。
应用举例:
GET方法:
GET/form.htmlHTTP/1.1(CRLF)POST方法:
POST/reg.jspHTTP/1.1(CRLF),第七章Android网络通信,AndroidHTTP通信Http响应,2)HTTP响应也是由三个部分组成:
状态行、消息报头、响应正文、状态行格式如下:
HTTP-VersionStatus-CodeReason-PhraseCRLF其中,HTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发回的响应状态代码;Reason-Phrase表示状态代码的文本描述。
状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:
1xx:
指示信息-表示请求已接收,继续处理2xx:
成功-表示请求已被成功接收、理解、接受3xx:
重定向-要完成请求必须进行更进一步的操作4xx:
客户端错误-请求有语法错误或请求无法实现5xx:
服务器端错误-服务器未能实现合法的请求,第七章Android网络通信,AndroidHTTP通信Http常见状态码描述,常见状态代码、状态描述、说明:
200OK/客户端请求成功400BadRequest/客户端请求有语法错误,不能被服务器所理解401Unauthorized/请求未经授权,这个状态代码必须和WWW-Authenticate报/头域一起使用403Forbidden/服务器收到请求,但是拒绝提供服务404NotFound/请求资源不存在,eg:
输入了错误的URL500InternalServerError/服务器发生不可预期的错误503ServerUnavailable/服务器当前不能处理客户端的请求,一段时间后,/可能恢复正常eg:
HTTP/1.1200OK(CRLF),第七章Android网络通信,AndroidHTTP通信-HttpClient实例,在表单提交中Get和POST主要有以下五种区别:
1.get是从服务器上获取数据,post是向服务器传送数据。
2.get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。
post是通过HTTPpost机制,将表单内各个字段与其内容放置在HTMLHEADER内一起传送到ACTION属性所指的URL地址。
用户看不到这个过程。
3.对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
4.get传送的数据量较小,不能大于2KB。
post传送的数据量较大,一般被默认为不受限制。
但理论上,IIS4中最大量为80KB,IIS5中为100KB。
5.get安全性非常低,post安全性较高。
第七章Android网络通信,HttpClient通过Get方式获取请求数据,Android的Get方式首先要初始化HttpClientclient=newDefaultHttpClient();HttpGetrequest=newHttpGet();在初始化url地址是,可以预先定义一个字符串,在初始化HttpClient时作为构造函数的参数输入;亦可在创建好HttpGet的实例后,采用request.setURL()的方式设置地址。
Get方式出了可以访问无参数的地址外也可带参数访问。
实例源码见备注:
其中googleWeatherUrl2可以为一个无参数的网络地址,也可以是带参数的网络地址,在本例中googleWeatherUrl2=http:
/,第七章Android网络通信,HttpClient通过Post方式获取请求数据,很多情况下,需要通过POST将本地的数据发送给服务器,但是post方式比get方式要复杂。
首先要通过HttpPost来构建一个post请求。
方式如下:
HttpPosthttppost=newHttpPost(url);另外需要使用NameValuePair来保存客户端传递的参数,可以使用BasicNameValuePair来构造一个要被传递的参数,通过add方法把这些参数加入到NameValuePair中,代码为:
Listparams=newArrayList();params.add(newBasicNameValuePair(valuename,value);其他的方式post方式与get方式没有多大差别,可以通过HttpClient来请求连接,返回并响应处理。
实例源码见备注,第七章Android网络通信,HttpClient实例运行结果展示,注意,要在AndroidManifest.xml中加入允许用户访问网络。
运行时的初始状态,Get方式,Post方式,第七章Android网络通信,AndroidURL通信,Java网络编程熟悉的人,肯定不会对HttpURLConnection陌生,HttpURLConnection属于JavaAPI的标准接口,包含在包.*中。
Android平台的网络应用绝大部分都是基于Java的编程接口的,也就是说我们开发类似的运用的时候可以有多种选择,比J2me确实好多了。
在Android中除了使用WebView控件访问网络以外,还有用代码方式访问网络的方法,代码方式有时候会显得更加灵活。
本节介绍使用URLConnection对象和HttpClient组件访问网络的方法。
而这两种方法和JavaWeb开发中的使用方式几乎没有区别,而Web开发的相关资料比比皆是,因此有兴趣的同学学完本讲之后可以专门去研究一下HttpClient4.0的内容,以求更深入的学习。
第七章Android网络通信,AndroidURL通信,下面提供了访问HTTP服务的基本功能。
使用这部分接口的基本操作主要包括:
第一,创建URL以及HttpURLConnection对象。
第二,连接参数设置。
第三,连接到服务器。
第四,向服务器写数据。
最后一步,从服务器读取数据。
URL的使用方法如下面的代码,见备注。
第七章Android网络通信,AndroidURL通信,其中URL的通信方式也可以分别采用前面章节介绍过的Post和Get两种方式来实现。
HttpURLConnection是java的标准类,继承自URLConnection类,URLConnection与HttpURLConnection都是抽象类,无法直接实例化对象。
其对象主要通过URL的openConnection方法获得,创建一个httpURLConnection连接的代码如下所示:
URLurl=newUR(“http:
/”);HttpURLConnectionurlConn=(HttpURLConnection)url.openConnection();,openConnection方法只创建URLConnection或者HttpURLConnection实例,但是并不进行真正的连接操作。
并且,每次openConnection都将创建一个新的实例。
因此,在连接之前我们可以对其一些属性进行设置,比如超时时间等。
第七章Android网络通信,AndroidURL通信,下面对HttpURLConnetcion实例的属性设置:
/设置输入/输出流connection.setDoOutput(true);connection.setDoInput(true);/设置请求的方式为Get或者Postconnection.setRequestMethod(“GET”);connection.setRequestMethod(“POST”);/在设置POST方式时要注意,POST请求方式不能够使用缓存connection.setUseCaches(false);在完成HttpURLConnection实例的初始化以后,我们可以分别使用Get和POST方式来完成一个实例。
第七章Android网络通信,AndroidURL通信实例布局文件,在该实例中Android设备的主界面主要包括一个静态文本框,两个按钮以及一个文本框用来显示请求返回的数据结果。
整个Activity的布局如下:
第七章Android网络通信,AndroidURL通信实例Get方式,Get用于获取静态页面,只要把参数写在URL后面即可传送数据。
一般只需要创建一个HttpURLConnection:
URLurl=newURL(http:
/urlConn=(HttpURLConnection)url.openConnection();注意:
HttpURLConnection是Java的标准类,继承自URLConnection类,两者都是抽象类,无法进行实例化对象。
其对象主要通过URL的openConnection方法获得采用get方式的HttpURLConnetction实例源码见备注:
此外,还需在AndroidManifest.xml中配置:
第七章Android网络通信,AndroidURL通信实例Post方式,在Post中,openConnection方法只创建了URLConnection或者HttpURLConnection实例,但是并不进行真正的连接操作。
并且,每次openConnection都将创建一个新的实例。
因此,连接之前我们需要对其一些属性进行操作,比如超过时间等。
下面是对HttpURLConnection实例的属性设置:
/设置输入(输出)流connection.setDoOutput(true);connection.setDoInput(true);/设置方式为POSTconnection.setRequestMethod(POST);/Post请求不能使用缓存connection.setUseCaches(false);/关闭HttpURLConnection连接urlConn.disconnect();采用post方式的HttpURLConnetction实例源码见备注:
第七章Android网络通信,AndroidURL通信实例效果图,URL通信的Get方式和Post方式效果图如下:
运行时的初始状态,Get方式,Post方式,第七章Android网络通信,Android套接字(Socket)通信,什么是套接字(Socket)?
NetworkAPI是典型的用于基于TCP/IP网络Java程序与其他程序通讯,NetworkAPI依靠Socket进行通讯。
Socket可以看成在两个程序进行通讯连接中的一个端点,一个程序将一段信息写入Socket中,该Socket将这段信息发送给另外一个Socket中,使这段信息能传送到其他程序中,如图:
第七章Android网络通信,Android套接字(Socket)通信,分析一下上图,HostA上的程序A将一段信息写入Socket中,Socket的内容被HostA的网络管理软件访问,并将这段信息通过HostA的网络接口卡发送到HostB,HostB的网络接口卡接收到这段信息后,传送给HostB的网络管理软件,网络管理软件将这段信息保存在HostB的Socket中,然后程序B才能在Socket中阅读这段信息。
假设在图中的网络中添加第三个主机HostC,那么HostA怎么知道信息被正确传送到HostB而不是被传送到HostC中了呢?
基于TCP/IP网络中的每一个主机均被赋予了一个唯一的IP地址。
每一个基于TCP/IP网络通讯的程序都被赋予了唯一的端口和端口号,端口是一个信息缓冲区,用于保留Socket中的输入/输出信息,端口号是一个16位无符号整数,范围是0-65535,以区别主机上的每一个程序(端口号就像房屋中的房间号),低于256的短口号保留给标准应用程序。
第七章Android网络通信,Android套接字(Socket)通信Socket类,两个常用的构造函数是Socket(InetAddressaddr,intport)和Socket(Stringhost,intport),两个构造函数都创建了一个基于Socket的连接服务器端流套接字的流套接字。
对于第一个InetAddress子类对象通过addr参数获得服务器主机的IP地址,对于第二个函数host参数包被分配到InetAddress对象中,如果没有IP地址与host参数相一致,那么将抛出UnknownHostException异常对象。
两个函数都通过参数port获得服务器的端口号。
如果创建了一个Socket对象,那么它可能通过调用Socket的getInputStream()方法从服务程序获得输入流读传送来的信息,也可能通过调用Socket的getOutputStream()方法获得输出流来发送消息。
第七章Android网络通信,Android套接字(Socket)通信Socket类,下面我们将示范一个流套接字的客户程序,这个程序将创建一个Socket对象,Socket将访问运行在指定主机端口10000上的服务程序,如果访问成功客户程序将给服务程序发送一系列命令并打印服务程序的响