第十三章 Android网络应用

qq_36081879 2017-12-18 10:58:00
手机本身是作为手持端来使用的,因此它的计算能力、存储能力都是有限的。它的主要优势时携带方便,可以随时打开,而且手机通常总是处于联网状态,因此网络对于手机应用的重要不言而喻。

Android完全支持JDK本身的TCP、UDP网络通讯API,也可以使用ServerSoocket、Socket来建立基于TCP\IP协议的网络通讯还可以使用DatagramSocket、Datagrampacket、MulticastSocket来建立基于UDP协议的网络通讯。如果读者有Java网络编程的经验,这些经验完全适用于Android应用的网络编程。Android也支持JDK提供的的URL、URLConnection等网络通讯API。

不仅如此,Android还内置了HttpClient,这样可以非常方便地发送HTTP请求,并获取HTTP响应,通过内置HttpClient,Android简化了与网络之间的交互,令人遗憾的是,Android并未内置对Web Service的支持,为了弥补这种不足,本章会介绍如何利用Ksopap2-android项目在Android应用中调用远程Web Service。

13.1 基于TCP协议的网络通讯
TCP\IP通讯协议是一种可靠的网络协议,它在通讯的两端各建立一个Socket,从而在通讯的两端之间形成网络虚拟链路。一旦建立了虚拟的网络链接。两端的程序就可以通过虚拟链路进行通讯了。Java对基于TCP协议的网络通讯提供了良好的封装,Java使用Socket对象来代表两端的通讯接口,并通过Socket产生IO流来进行网络通讯。

13.1.1 TCP协议基础

IP协议在Intent上使用的一个关键协议,它的全称是Intent Protocol,即Intent协议,通常简称IP协议。通过使用IP协议,是Intent成为一个允许连接不通类型的计算机和不同操作系统的网络。

要是两台计算机彼此之间进行通讯,两台计算机必须使用同一种“语言”,IP协议只保证计算机能发送和接收分组数据。IP协议负责将消息从一个主机发送到另一个主机,消息在传送的过程中被分割成一个个小包。

尽管计算机通过安装IP软件,保证了计算机之间可以发送和接收数据,但IP协议还不能解决数据分组在传递过程中可能出现的问题。因此,若要解决可能出现的问题,链接上Intent的计算机还需要安装TCP协议来提供可靠并且无差错的通讯服务。

TCP协议被称为一种端对端协议。这是因为他为两台计算机之间的连接起了重要作用:当一台计算机需要与另一台远程计算机连接时,TCP协议会让他们建立一个连接------用于发送和接收数据的虚拟链路。

TCP协议负责收集这些信息包,并将其按适当的次序放好传送,在接收端收到再将其正确地还原。TCP协议保证了数据抱在传递中准确无误。TCP[协议使用重发机制:当一个通讯实体发送一个消息给另一个通讯实体的确认信息,如果没有收到另一个通讯实体的确认信息,则会再次重发刚才的发送的消息。

通过这种重发机制,TCP协议向应用程序提供可靠的通讯链接,使它能够自动适应网上的各种变化。即使在Intent暂时出现出现堵塞的情况下,TCP也能够保证通讯的可靠。


综上所述,虽然IP和TCP这两个协议的功能不尽相同买也可以分开单独使用,但它们是在同一时期作为一个协议来设计的,并且在功能上也是互补的。只有两者结合,才能保证Intent在复杂的环境下正常运行。凡是要连接到Intent的计算机,都必须同时安装和使用这两个协议,因此在实际中常把这两个协议统称为TCP\IP协议。

13.1.2 使用ServerSocket创建TCP服务端

从图13.1中看上去TCP通讯的两个通讯实体之间没有服务器端、客户端之分,但那是两个通讯实体已经建立虚拟链接之后的示意图,在两个通讯实体没有建立虚拟链接之前,必须有一个通讯实体先做出“主动姿态”,主动接收来自其他通讯实体的连接请求。

Java中能接收其他通讯实体连接的类是ServerSocket,ServerSocket对象用于监听来自客户端的Socket连接,如果没有连接,他将一直处于等待状态。ServerSocket包含一个监听来自客户端连接请求的方法。


1、如果接收到一个客户端Socket的连接请求,该方法将返回一个与连接客户端Socket对应的Socket(如图13.1所示,每个TCP连接有两个Socket):否则该方法将一直处于等待状态,线程也被阻塞。

为了创建ServerSocket对象,ServerSocket类提供了如下几个构造器。

2、ServerSocket(int port):用于指定的端口port来创建一个ServerSocket。该端口应该有一个有效的端口整数值0-65535.

ServerSocket(int port,int backlog):增加一个用来改变连接队列长度的参数backlog。

ServerSocket(int port,int backlog,inetAddress localAddr):在机器存在多个IP地址的情况下,允许通过localAddr这个参数来指定将ServerSocket绑定到指定的IP地址。

当ServerSocket使用完毕后,应使用ServerSocket的close()方法来关闭该ServerSocket。在通常情况下,服务器不应该只接受一个客户端请求,而应该不断地接收来自客户端的所有请求,所以Java程序通常会通过循环不断地调用ServerSocket的accept()方法,如下代码片段所示:


提示:

上面的程序中创建ServerSocket没有指定IP地址,则该ServerSocket将会绑定到本机默认的IP地址。程序中使用3000作为ServerSocket的端口号,通常推荐使用1024以上的端口,主要是为了避免与其他应用程序的通用端口冲突。

由于手机无线上网的IP地址通常都是有移动运营公司动态分配的,一般不会有自己固定的IP地址,因此很少在手机上运行服务器端,服务器端通常运行在固定IP地址的服务端上。本节所介绍的应用程序的服务器端也是运行在PC上的。

13.1.3 使用Socket进行通讯

客户端通常可以使用Socket的构造器来连接到指定服务器,Socket通常可提供如下两个构造器

1、Socket(InetAddress/String remoteAddress,int port):创建连接到指定远程主机、远程端口的Socket,该构造器没有指定本地地址、本地端口,默认使用本地主机的默认IP地址,默认使用系统分配的端口。


2、创建连接到指定远程主机、远程端口的Socket,并指定本地IP地址和本地端口,适用于本地主机有多个IP地址的情形。
...全文
182 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
路过 学习

80,358

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧