首页 理论教育 如何使用Android与后台进行通信?

如何使用Android与后台进行通信?

时间:2023-06-15 理论教育 版权反馈
【摘要】:与后台通信在本书中是指Android如何与后台Web数据进行交互,具体包括与后台进行增、删、改、查等操作。Android与后台通信的方式有多种,可以通过Http通信,还可以通过Socket通信。下面介绍几种基于Http和Socket的Android应用程序通信方式,具体有:不带参数HttpURLConnection与后台通信、带参数HttpURLConnectionGET方式、带参数HttpURLConnectionPOST方式、带参数HttpClient方式及Socket方式。代码清单4-46 HttpURLConnection GET通信方式示例MainActivity.java最后,需要在AndroidManifest.xml要添加访问权限,具体如代码清单4-47所示。

如何使用Android与后台进行通信?

与后台通信在本书中是指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对象,如:

978-7-111-37968-3-Chapter04-102.jpg

2)使用HttpURLConnection打开连接,如:

978-7-111-37968-3-Chapter04-103.jpg

3)读取数据流,如:

978-7-111-37968-3-Chapter04-104.jpg

4)为输出流创建BufferedReader,如:

978-7-111-37968-3-Chapter04-105.jpg

5)使用循环读取流传过来的数据,如:

978-7-111-37968-3-Chapter04-106.jpg

6)关闭InputStreamReader和HttpURLConnection,如:

978-7-111-37968-3-Chapter04-107.jpg

下面通过一个示例,讲述不带参数HttpURLConnection通信的具体用法,示例代码运行结果如图4-17所示。

978-7-111-37968-3-Chapter04-108.jpg

图4-17 不带参数HttpURLConnection与后台通信示例代码运行结果

首先,介绍如何通过xml布局实现这一效果,如代码清单4-42所示。

代码清单4-42 不带参数HttpURLConnection通信示例(第4章\Demo_04_15)main.xml

978-7-111-37968-3-Chapter04-109.jpg

其次,介绍Activityjava代码如何配合布局实现HttpURLConnection通信,如代码清单4-43所示。

代码清单4-43 不带参数HttpURLConnection通信示例(第4章\Demo_04_15)MainActivity.java

978-7-111-37968-3-Chapter04-110.jpg

978-7-111-37968-3-Chapter04-111.jpg

978-7-111-37968-3-Chapter04-112.jpg

最后,需要在AndroidManifest.xml要添加访问权限,如代码清单4-44所示。

代码清单4-44 不带参数HttpURLConnection通信示例(第4章\Demo_04_15)AndroidManifest.xml

978-7-111-37968-3-Chapter04-113.jpg

2.HttpURLConnectionGET通信方式

有一定编程基础的读者都知道,带参数的HttpURLConnection通信方式有两种,这两种方式分别是GET和POST,GET请求可以获取静态页面,也可以把参数放在URL字符串后面,它处理的数据量相对较少。使用这种通信方式,如果参数中有中文,则容易出现乱码,导致参数无法正确地被后台程序所处理。而POST不是放在URL字符串后面,而是放在Http请求的正文内。相对而言,处理的参数数据量比较大,可以通过设置编码方式及对参数进行封装,能处理中文且不易乱码,且在传输中相对安全。因此,POST和GET的主要区别在于请求方式的不同,GET可以获得静态页面,也可以把参数放在URL字符串后面,传递给服务器,而POST方法的参数则是放在Http请求内容中。

下面通过一个示例,讲述HttpURLConnection GET通信方式,示例代码运行结果如图4-18所示。

首先,介绍如何通过xml布局实现这一效果,如代码清单4-45所示。

978-7-111-37968-3-Chapter04-114.jpg

图4-18 HttpURLConnectionGET方式与后台通信运行结果

代码清单4-45 HttpURLConnection GET通信方式示例(第4章\Demo_04_16)main.xml

978-7-111-37968-3-Chapter04-115.jpg

其次,介绍Activity java代码如何配合布局实现HttpURLConnection通信,如代码清单4-46所示。

代码清单4-46 HttpURLConnection GET通信方式示例(第4章\Demo_04_16)MainActivity.java

978-7-111-37968-3-Chapter04-116.jpg

978-7-111-37968-3-Chapter04-117.jpg

978-7-111-37968-3-Chapter04-118.jpg

最后,需要在AndroidManifest.xml要添加访问权限,具体如代码清单4-47所示。

代码清单4-47 HttpURLConnection GET通信方式示例(第4章\Demo_04_16)AndroidManifest.xml

978-7-111-37968-3-Chapter04-119.jpg

3.HttpURLConnectionPOST通信方式

HttpURLConnectionPOST通信方式在上一节已经阐述过,在这里需要注意的是:在通信过程中需要将HttpURLConnection.setDoOutput()和HttpURLConnection.setDoInput()设置为true。这一节重点讲解HttpURLConnectionPOST通信方式的参数名和参数值如何放在正文中被处理,在这里需要使用到URLEncoder.encode(Strings,Stringencoding)对参数进行封装,第一个参数是参数的变量名,第二个参数是编码格式。把封装好的参数通过DataOutputStream.writeBytes()写进流中。到本节为止,讲解了HttpURLConnection三种通信方式,大家可以把三个小程序合并成一个程序,比较HttpURLConnection三种通信方式的处理过程的区别。示例代码运行结果如图4-19、图4-20所示。

978-7-111-37968-3-Chapter04-120.jpg

图4-19 HttpURLConnection通信方式运行结果(1)

978-7-111-37968-3-Chapter04-121.jpg

图4-20 HttpURLConnection通信方式运行结果(2)

首先,介绍如何通过xml布局实现这一效果,如代码清单4-48、4-49所示(可直接使用上一节的代码)。

代码清单4-48 HttpURLConnection POST通信方式示例(第4章\Demo_04_17)main.xml

978-7-111-37968-3-Chapter04-122.jpg

978-7-111-37968-3-Chapter04-123.jpg

代码清单4-49 HttpURLConnection POST通信方式示例(第4章\Demo_04_17)http.xml

978-7-111-37968-3-Chapter04-124.jpg

其次,介绍Activity java代码如何配合布局实现HttpURLConnection通信,如代码清单4-50、4-51所示。

代码清单4-50 HttpURLConnection POST通信方式示例(第4章\Demo_04_17)MainActivity.java

978-7-111-37968-3-Chapter04-125.jpg

978-7-111-37968-3-Chapter04-126.jpg

978-7-111-37968-3-Chapter04-127.jpg

代码清单4-51 HttpURLConnection POST通信方式示例(第4章\Demo_04_17)Activity04.java

978-7-111-37968-3-Chapter04-128.jpg

978-7-111-37968-3-Chapter04-129.jpg

978-7-111-37968-3-Chapter04-130.jpg

978-7-111-37968-3-Chapter04-131.jpg

最后,需要在AndroidManifest.xml要添加访问权限,具体如代码清单4-52所示。

代码清单4-52 HttpURLConnection POST通信方式示例(第4章\Demo_04_17)AndroidManifest.xml

978-7-111-37968-3-Chapter04-132.jpg

4.HttpClient通信方式(GET、POST)

虽然在JDK的java.net包中已经提供了访问HTTP协议的基本功能,但是对于大部分应用程序来说,JDK库本身所提供的功能还不够丰富和灵活。HttpClient是Apache JakartaCommon下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且支持最新版本的HTTP协议。下面介绍HttpClient通信的主要步骤。

1)创建HttpGet连接对象,如:

978-7-111-37968-3-Chapter04-133.jpg

2)创建HttpClient实例,如:

978-7-111-37968-3-Chapter04-134.jpg

3)请求HttpClient,取得HttpResponse,如:

978-7-111-37968-3-Chapter04-135.jpg(www.xing528.com)

4)判断Http响应请求是否成功,如:

978-7-111-37968-3-Chapter04-136.jpg

5)读response,返回数据集结果,如:

978-7-111-37968-3-Chapter04-137.jpg

6)释放连接,无论执行方法是否成功,都必须释放连接。

下面通过一个示例,讲述HttpClient GET和POST的用法,示例代码运行结果如图4-21和图4-22所示。

978-7-111-37968-3-Chapter04-138.jpg

图4-21 HttpClient方式与后台通信运行结果

978-7-111-37968-3-Chapter04-139.jpg

图4-22 HttpClient通信(GET、POST)示例运行结果

首先,介绍如何通过xml布局实现这一效果,如代码清单4-53、4-54所示。

代码清单4-53 HttpClient通信(GET、POST)示例(第4章\Demo_04_18)main.xml

978-7-111-37968-3-Chapter04-140.jpg

978-7-111-37968-3-Chapter04-141.jpg

代码清单4-54 HttpClient通信(GET、POST)示例(第4章\Demo_04_18)http.xml

978-7-111-37968-3-Chapter04-142.jpg

其次,介绍Activity java代码如何配合布局实现HttpClient通信方式,如代码清单4-55至代码清单4-57所示。

代码清单4-55 HttpClient通信(GET、POST)示例(第4章\Demo_04_18)MainActivity.java

978-7-111-37968-3-Chapter04-143.jpg

978-7-111-37968-3-Chapter04-144.jpg

978-7-111-37968-3-Chapter04-145.jpg

代码清单4-56 HttpClient通信(GET、POST)示例(第4章\Demo_04_18)Activity02.java

978-7-111-37968-3-Chapter04-146.jpg

978-7-111-37968-3-Chapter04-147.jpg

978-7-111-37968-3-Chapter04-148.jpg

代码清单4-57 HttpClient通信(GET、POST)示例(第4章\Demo_04_18)Activity03.java

978-7-111-37968-3-Chapter04-149.jpg

978-7-111-37968-3-Chapter04-150.jpg

978-7-111-37968-3-Chapter04-151.jpg

最后,需要在AndroidManifest.xml要添加访问权限,具体如代码清单4-58所示。

代码清单4-58 HttpClient通信(GET、POST)示例(第4章\Demo_04_18)AndroidManifest.xml

978-7-111-37968-3-Chapter04-152.jpg

5.Socket方式

应用程序可以通过Socket(套接字)来发送和接收数据,这就好像应用程序打开了一个文件句柄,可以将数据读写到稳定的存储器上一样。使用Socket可以将应用程序添加到网络中,并与处于同一网络中的其他应用程序进行通信。Socket包括流套接字(Stream Socket)和数据报套接字(Datagram Socket)两种通信方式。流套接字将TCP作为其端对端协议,提供了一个可信赖的字节流服务。而数据报套接字使用UDP协议,提供了一个“尽力而为”的数据报服务,应用程序可以通过它发送最长65500字节的个人信息。Socket通信的原理图如图4-23所示。

978-7-111-37968-3-Chapter04-153.jpg

图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

978-7-111-37968-3-Chapter04-154.jpg

TCP-Socket操作原理如图4-24所示。

978-7-111-37968-3-Chapter04-155.jpg

图4-24 TCP-Socket操作原理图

(2)使用基于UDP的Socket

要使用基于UDP的Socket,必须先了解Socket通信相关类,见表4-12。

表4-12 基于UDP的Socket通信相关类

978-7-111-37968-3-Chapter04-156.jpg

下面通过一个示例讲述Socket通信方式,该示例主要功能是模拟Socket通信的主要过程。

首先,介绍Socket通信的服务器端代码,在eclipse平台上建java项目,如代码清单4-59、4-60所示。

代码清单4-59 Socket通信示例(第4章\PCSocketServer)服务器端代码TCPDesktopServer.java

978-7-111-37968-3-Chapter04-157.jpg

978-7-111-37968-3-Chapter04-158.jpg

代码清单4-60 Socket通信示例(第4章\PCSocketServer)服务器端代码UDPClient.java

978-7-111-37968-3-Chapter04-159.jpg

978-7-111-37968-3-Chapter04-160.jpg

其次,介绍如何在Android客户端的xml布局实现这一效果,如代码清单4-61所示。

代码清单4-61 Socket通信示例Android客户端的xml布局(第4章\Demo_04_18)main.xml

978-7-111-37968-3-Chapter04-161.jpg

然后,介绍Activity java代码如何配合布局实现Socket通信过程,如代码清单4-62、4-63所示。

代码清单4-62 Socket通信示例(第4章\Demo_04_19)MainActivity.java

978-7-111-37968-3-Chapter04-162.jpg

978-7-111-37968-3-Chapter04-163.jpg

代码清单4-63 Socket通信示例(第4章\Demo_04_19)TCPClient.java

978-7-111-37968-3-Chapter04-164.jpg

978-7-111-37968-3-Chapter04-165.jpg

最后,需要在客户端Android程序中的AndroidManifest.xml要添加访问权限,如代码清单4-64所示。

代码清单4-64 Socket通信示例(第4章\Demo_04_19)AndroidManifest.xml

978-7-111-37968-3-Chapter04-166.jpg

最好在调试模式下运行,以便更清楚地弄懂整个通信过程。具体方法如下:

1)第一步,在程序中设断点,单击工具栏的调试按钮,进入调试状态,如图4-25所示。

978-7-111-37968-3-Chapter04-167.jpg

图4-25 eclipse开发平台客户端和服务器端调试界面

2)第二步,单步调试代码,观察服务端控制台输出与客户端Android程序log(日志)文件,如图4-26、4-27所示。

978-7-111-37968-3-Chapter04-168.jpg

图4-26 服务端控制台输出

978-7-111-37968-3-Chapter04-169.jpg

图4-27 客户端Android程序log(日志)文件

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈