与后台通信在本书中是指Android如何与后台Web数据进行交互,具体包括与后台进行增、删、改、查等操作。虽然Android提供了SQLite(在后面的章节中涉及)可以直接在Android项目中直接建小型数据库,对数据进行增、删、改、查的操作,但是由于手机内存容量及性能的限制、SQLite的功能不完善,在Android应用程序中进行大量处理数据是不太合理的,因此提倡通过网络连接与后台交互的方式,通过在后台创建处理程序,然后与前端进行通信。
Android与后台通信的方式有多种,可以通过Http通信,还可以通过Socket通信。Http通信是基于HTTP协议,该协议可以说是当今Internet上使用最多、最重要的协议,越来越多的Java应用程序需要直接通过HTTP协议来访问网络资源。有关HTTP通信的包存在于JDK的java.net包中,在该包中提供了访问HTTP协议的基本功能。而Socket通信方式属于套接字通信方式。下面介绍几种基于Http和Socket的Android应用程序通信方式,具体有:不带参数(直接获取数据)HttpURLConnection与后台通信、带参数HttpURLConnectionGET方式、带参数HttpURLConnectionPOST方式、带参数HttpClient方式(GET和POST方式)及Socket方式。
1.不带参数HttpURLConnection通信方式
不带参数HttpURLConnection如何与后台程序进行交互呢,这主要是如何从后台程序中直接获取数据的过程,在获取数据的过程中不带任何处理参数。这是最简单的通信方式,例如查询所有信息或者获取后台的某一个XML文件,就可以使用不带任何参数的HttpURLConnection通信方式。下面介绍HttpURLConnection通信的主要步骤。
1)构造一个URL对象,如:
2)使用HttpURLConnection打开连接,如:
3)读取数据流,如:
4)为输出流创建BufferedReader,如:
5)使用循环读取流传过来的数据,如:
6)关闭InputStreamReader和HttpURLConnection,如:
下面通过一个示例,讲述不带参数HttpURLConnection通信的具体用法,示例代码运行结果如图4-17所示。
图4-17 不带参数HttpURLConnection与后台通信示例代码运行结果
首先,介绍如何通过xml布局实现这一效果,如代码清单4-42所示。
代码清单4-42 不带参数HttpURLConnection通信示例(第4章\Demo_04_15)main.xml
其次,介绍Activityjava代码如何配合布局实现HttpURLConnection通信,如代码清单4-43所示。
代码清单4-43 不带参数HttpURLConnection通信示例(第4章\Demo_04_15)MainActivity.java
最后,需要在AndroidManifest.xml要添加访问权限,如代码清单4-44所示。
代码清单4-44 不带参数HttpURLConnection通信示例(第4章\Demo_04_15)AndroidManifest.xml
2.HttpURLConnectionGET通信方式
有一定编程基础的读者都知道,带参数的HttpURLConnection通信方式有两种,这两种方式分别是GET和POST,GET请求可以获取静态页面,也可以把参数放在URL字符串后面,它处理的数据量相对较少。使用这种通信方式,如果参数中有中文,则容易出现乱码,导致参数无法正确地被后台程序所处理。而POST不是放在URL字符串后面,而是放在Http请求的正文内。相对而言,处理的参数数据量比较大,可以通过设置编码方式及对参数进行封装,能处理中文且不易乱码,且在传输中相对安全。因此,POST和GET的主要区别在于请求方式的不同,GET可以获得静态页面,也可以把参数放在URL字符串后面,传递给服务器,而POST方法的参数则是放在Http请求内容中。
下面通过一个示例,讲述HttpURLConnection GET通信方式,示例代码运行结果如图4-18所示。
首先,介绍如何通过xml布局实现这一效果,如代码清单4-45所示。
图4-18 HttpURLConnectionGET方式与后台通信运行结果
代码清单4-45 HttpURLConnection GET通信方式示例(第4章\Demo_04_16)main.xml
其次,介绍Activity java代码如何配合布局实现HttpURLConnection通信,如代码清单4-46所示。
代码清单4-46 HttpURLConnection GET通信方式示例(第4章\Demo_04_16)MainActivity.java
最后,需要在AndroidManifest.xml要添加访问权限,具体如代码清单4-47所示。
代码清单4-47 HttpURLConnection GET通信方式示例(第4章\Demo_04_16)AndroidManifest.xml
3.HttpURLConnectionPOST通信方式
HttpURLConnectionPOST通信方式在上一节已经阐述过,在这里需要注意的是:在通信过程中需要将HttpURLConnection.setDoOutput()和HttpURLConnection.setDoInput()设置为true。这一节重点讲解HttpURLConnectionPOST通信方式的参数名和参数值如何放在正文中被处理,在这里需要使用到URLEncoder.encode(Strings,Stringencoding)对参数进行封装,第一个参数是参数的变量名,第二个参数是编码格式。把封装好的参数通过DataOutputStream.writeBytes()写进流中。到本节为止,讲解了HttpURLConnection三种通信方式,大家可以把三个小程序合并成一个程序,比较HttpURLConnection三种通信方式的处理过程的区别。示例代码运行结果如图4-19、图4-20所示。
图4-19 HttpURLConnection通信方式运行结果(1)
图4-20 HttpURLConnection通信方式运行结果(2)
首先,介绍如何通过xml布局实现这一效果,如代码清单4-48、4-49所示(可直接使用上一节的代码)。
代码清单4-48 HttpURLConnection POST通信方式示例(第4章\Demo_04_17)main.xml
代码清单4-49 HttpURLConnection POST通信方式示例(第4章\Demo_04_17)http.xml
其次,介绍Activity java代码如何配合布局实现HttpURLConnection通信,如代码清单4-50、4-51所示。
代码清单4-50 HttpURLConnection POST通信方式示例(第4章\Demo_04_17)MainActivity.java
代码清单4-51 HttpURLConnection POST通信方式示例(第4章\Demo_04_17)Activity04.java
最后,需要在AndroidManifest.xml要添加访问权限,具体如代码清单4-52所示。
代码清单4-52 HttpURLConnection POST通信方式示例(第4章\Demo_04_17)AndroidManifest.xml
4.HttpClient通信方式(GET、POST)
虽然在JDK的java.net包中已经提供了访问HTTP协议的基本功能,但是对于大部分应用程序来说,JDK库本身所提供的功能还不够丰富和灵活。HttpClient是Apache JakartaCommon下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且支持最新版本的HTTP协议。下面介绍HttpClient通信的主要步骤。
1)创建HttpGet连接对象,如:
2)创建HttpClient实例,如:
3)请求HttpClient,取得HttpResponse,如:
(www.xing528.com)
4)判断Http响应请求是否成功,如:
5)读response,返回数据集结果,如:
6)释放连接,无论执行方法是否成功,都必须释放连接。
下面通过一个示例,讲述HttpClient GET和POST的用法,示例代码运行结果如图4-21和图4-22所示。
图4-21 HttpClient方式与后台通信运行结果
图4-22 HttpClient通信(GET、POST)示例运行结果
首先,介绍如何通过xml布局实现这一效果,如代码清单4-53、4-54所示。
代码清单4-53 HttpClient通信(GET、POST)示例(第4章\Demo_04_18)main.xml
代码清单4-54 HttpClient通信(GET、POST)示例(第4章\Demo_04_18)http.xml
其次,介绍Activity java代码如何配合布局实现HttpClient通信方式,如代码清单4-55至代码清单4-57所示。
代码清单4-55 HttpClient通信(GET、POST)示例(第4章\Demo_04_18)MainActivity.java
代码清单4-56 HttpClient通信(GET、POST)示例(第4章\Demo_04_18)Activity02.java
代码清单4-57 HttpClient通信(GET、POST)示例(第4章\Demo_04_18)Activity03.java
最后,需要在AndroidManifest.xml要添加访问权限,具体如代码清单4-58所示。
代码清单4-58 HttpClient通信(GET、POST)示例(第4章\Demo_04_18)AndroidManifest.xml
5.Socket方式
应用程序可以通过Socket(套接字)来发送和接收数据,这就好像应用程序打开了一个文件句柄,可以将数据读写到稳定的存储器上一样。使用Socket可以将应用程序添加到网络中,并与处于同一网络中的其他应用程序进行通信。Socket包括流套接字(Stream Socket)和数据报套接字(Datagram Socket)两种通信方式。流套接字将TCP作为其端对端协议,提供了一个可信赖的字节流服务。而数据报套接字使用UDP协议,提供了一个“尽力而为”的数据报服务,应用程序可以通过它发送最长65500字节的个人信息。Socket通信的原理图如图4-23所示。
图4-23 Socket通信原理图
从图中进一步看出,应用程序可以使用UDP或者TCP协议这两种套接字进行通信。当客户端和服务器端的协议相对应时,客户端使用TCP,服务器端也使用TCP。TCP协议的通信过程是:首先连接接收方,然后发送数据,可以保证成功率,但速度相对较慢。UDP协议的通信过程是:把数据打包成数据包,然后直接发送对应的IP地址,这种通信方式速度快,但是不保证成功率,并且数据大小有限。下面重点介绍Socket这两种方式进行通信所涉及的类和方法。
(1)使用基于TCP协议的Socket通信
基于TCP协议的Socket通信是指一个客户端要发起一次通信,首先必须知道运行服务器端的主机IP地址,然后由网络识别出目标地址,将客户端发送的信息传递到正确的主机上。在Java中,地址可以由一个字符串来定义,这个字符串可以使用数字型的地址(比如192.168.1.1)也可以是主机名(example.com)这样的地址。表4-11列出了基于TCP协议操作Socket的API。
表4-11 基于TCP协议操作Socket的API
TCP-Socket操作原理如图4-24所示。
图4-24 TCP-Socket操作原理图
(2)使用基于UDP的Socket
要使用基于UDP的Socket,必须先了解Socket通信相关类,见表4-12。
表4-12 基于UDP的Socket通信相关类
下面通过一个示例讲述Socket通信方式,该示例主要功能是模拟Socket通信的主要过程。
首先,介绍Socket通信的服务器端代码,在eclipse平台上建java项目,如代码清单4-59、4-60所示。
代码清单4-59 Socket通信示例(第4章\PCSocketServer)服务器端代码TCPDesktopServer.java
代码清单4-60 Socket通信示例(第4章\PCSocketServer)服务器端代码UDPClient.java
其次,介绍如何在Android客户端的xml布局实现这一效果,如代码清单4-61所示。
代码清单4-61 Socket通信示例Android客户端的xml布局(第4章\Demo_04_18)main.xml
然后,介绍Activity java代码如何配合布局实现Socket通信过程,如代码清单4-62、4-63所示。
代码清单4-62 Socket通信示例(第4章\Demo_04_19)MainActivity.java
代码清单4-63 Socket通信示例(第4章\Demo_04_19)TCPClient.java
最后,需要在客户端Android程序中的AndroidManifest.xml要添加访问权限,如代码清单4-64所示。
代码清单4-64 Socket通信示例(第4章\Demo_04_19)AndroidManifest.xml
最好在调试模式下运行,以便更清楚地弄懂整个通信过程。具体方法如下:
1)第一步,在程序中设断点,单击工具栏的调试按钮,进入调试状态,如图4-25所示。
图4-25 eclipse开发平台客户端和服务器端调试界面
2)第二步,单步调试代码,观察服务端控制台输出与客户端Android程序log(日志)文件,如图4-26、4-27所示。
图4-26 服务端控制台输出
图4-27 客户端Android程序log(日志)文件
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。