版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Andriod应用开发基础教程第9章网络编程9.1UDP、TCP、HTTP协议基础UDP是一种无连接的、不可靠的协议,它不会对数据进行确认或重传,也不会进行数据排序。UDP不需要建立连接,以报文(Datagram)为单位来收发数据,数据包可以直接发送,每个UDP包都是独立的,并且可能会在传输过程中丢失、重复、乱序。因此,UDP适用于需要快速传输数据,而对数据可靠性要求不高的应用场景,如网络直播、在线游戏、IP电话、视频会议等。TCP是一种面向连接的、可靠的协议,它为数据包的传输提供了确认、重传、数据排序和流量控制等功能,保证了数据的可靠性。TCP通过三次握手来建立连接,四次挥手来终止连接。在传输数据时,TCP将数据分成多个包进行传输,每个包都有自己的编号和校验,接收方会对每个包进行确认,如果某个包没有被确认,发送方会重新发送这个包,直到接收方确认为止。TCP适用于需要可靠传输的应用场景,如文件传输、Web浏览器、电子邮件等。以人与人之间的通信为例,UDP协议就相当于是写信给对方,寄出去信件之后不能知道对方是否收到信件,信件内容是否完整,也不能得到及时反馈,而TCP协议就像是打电话通信,在这一系列流程都能得到及时反馈,并能确保对方及时接收到。HTTP协议全称为HypertextTransferProtocol,即超文本传输协议,是互联网上应用最为广泛的一种网络传输协议。HTTP协议定义了客户端(Browser)与服务器之间的通信规范,以实现对各种资源(如HTML页面、图像、音频、视频等)的传输和访问。HTTP协议是一个无状态的应用层协议,基于请求响应模式且请求和响应都是一条文本消息,再则HTTP协议是一个无连接协议,所以每个请求都是独立的,服务器处理请求后立即关闭连接。9.2Socket通信Socket就是两个应用程序通过一个双向的通信连接实现数据的交换,连接的一段就是一个Socket,又称为套接字。实现一个Socket连接通信至少需要两个套接字,一个运行在服务端(插孔),一个运行在客户端(插头)。套接字用于描述IP地址和端口,是一个通信链的句柄。应用程序通过套接字向网络发出请求或应答网络请求。注意的是套接字既不是程序也不是协议,只是操作系统提供给通信层的一组抽象API接口。Socket通信是指应用程序利用Socket接口实现的网络通信,用于在不同的计算机之间传输数据。Socket是一种标准的API(应用程序接口),可用于在不同的计算机之间传输数据,它支持TCP、UDP等多种网络协议。在Socket通信中,客户端和服务器通过Socket接口进行通信,通信时需指定IP地址和端口号,IP地址用于唯一标志网络设备,端口主要用于区分主机上的不同应用(没有端口,操作系统没有办法区分数据到底应该发送到哪一个应用上。客户端创建一个Socket对象,并将其连接到服务器上的一个特定端口号,通过Socket对象向服务器发送数据。服务器监听指定端口号,等待客户端的连接请求,当连接请求到达时,服务器会创建一个新的Socket对象,并与客户端的Socket对象建立连接。然后,服务器和客户端之间就可以进行数据传输了。Socket通信的优点是它是跨平台的,因为Socket接口是标准的API,不受特定操作系统的限制。它也很灵活,可以使用不同的网络协议(如TCP和UDP),以满足不同的需求。Socket通信广泛应用于客户端-服务器应用程序、分布式计算、实时数据传输等领域。例如,Web服务器使用Socket通信与客户端浏览器进行通信,从而提供Web服务。9.2.1UDP类型
基于UDP协议的SocketAPI中,要分清楚DatagramSocket和DatagramPacket这两个类。Datagram意为数据包,Packet意为包裹,这两个类的关系相当于DatagramPacket是发送接收的数据包包裹,DatagramSocket是发送接收数据包包裹的快递员。表9-1(a)DatagramPacket类构造方法构造函数名称说明DatagramPacket(byte[]buf,intlength)接收构造函数,用来接收长度为length的数据包DatagramPacket(byte[]buf,intlength,InetAddressaddress,intport)发送构造函数,构造数据报包,用来将长度为
length的包发送到指定主机上的指定端口号包表9-1(b)DatagramPacket类成员方法成员方法说明InetAddressgetAddress()从接收或发送的数据报中获取对端的IP地址intgetPort()intgetPort()
从接收或发送的数据报中获取对端的端口号byte[]getData()获取数据报中的数据,数据存在字节数组中intgetLength()获取数据报中的数据的实际长度InetAddressgetAddress()从接收或发送的数据报中获取对端的IP地址DatagramPacket类表示数据报包,来实现无连接包投递服务。每条报文仅根据该包中包含的信息从一台机器路由到另一台机器。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达,不保证包顺利投递。表9-2(a)DatagramSocket类构造方法表9-2(b)DatagramSocket类成员和方法DatagramSocket类表示用来发送和接收数据报包的套接字。数据报套接字是包投递服务的发送或接收点。每个在数据报套接字上发送或接收的包都是单独编址和路由的。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。在DatagramSocket总是启用UDP广播发送。为了接收广播包,应该将DatagramSocket绑定到通配符地址。在某些实现中,将DatagramSocket绑定到一个更加具体的地址时广播包也可以被接收。构造函数名称说明DatagramSocket(intport)创建一个UDPSocket对象,一般用于服务器,需要指定本机端口号(port)DatagramSocket()创建一个UDPSocket对象,一般用于客户端,不需要指定本机端口号,由操作系统随机分配构造函数名称说明void
receive(DatagramPacketp)接收数据报,如果没接收到,阻塞等待void
send(DatagramPacketp)发送数据报,不会阻塞等待void
close()关闭套接字案例9.1
通过UDP实现网络通信。(参考代码见:web模块下com.example.web.udp包中)依次运行Udpserver和Udpclient,UDP客户端发送信息“我是客户端”,UDP服务端输出的信息如图9-3(a)所示,UDP服务端发送信息“服务端在此”,UDP客户端输出的信息如图9-3(b)所示,UDP客户端和服务端实现相互通信。图9-3(a)UDP服务端输出信息图9-3(b)UDP客户端输出信息9.2.2TCP类型
基于TCP协议的SocketAPI中,ServerSocket和Socket这两个类尤为重要。其中类ServerSocket实现服务器套接字,该类遵循TCP协议,所以必须要和客户端Socket建立连接才能完成信息的接送,服务器套接字等待来自网络的请求,它基于该请求执行某些操作,请求成功则向请求者返回结果。Socket类现了客户端套接字,套接字是两台机器间通信的端点,该类同样遵循TCP协议,所以必须与ServerSocket建立连接后,才能进行信息的传送。表9-3(a)ServerSocket类成员方法表9-3(b)Socket类成员方法类名称用途Socketaccept()侦听并接收到此套接字的连接voidbind(SocketAddressendpoint,intbacklog)将ServerSocket绑定到特定地址(IP地址和端口号)InetAddressgetInetAddress()返回此服务器套接字的本地地址intgetLocalPort()返回此套接字正在侦听的端口号SocketAddressgetLocalSocketAddress()返回此套接字绑定到的端点的地址voidclose()关闭这个套接字类名称用途voidbind(SocketAddressbindpoint)将套接字绑定到本地地址InetAddressgetLocalAddress()获取绑定的套接字的本地地址InetAddressgetInetAddress()返回套接字连接的地址intgetLocalPort()返回此套接字绑定的本地端口号intgetPort()返回此套接字连接的远程端口号OutputStreamgetOutputStream()返回此套接字的输出流InputStreamgetInputStream()返回此套接字的输入流voidshutdownInput()将此套接字的输入流放在“流结束”中voidshutdownOutput()禁用此套接字的输出流voidclose()关闭此套接字表9-4基于TCP协议的Socket通信用到的其它类类名称用途InputStream、OutputStream处理字节流的抽象类,字节流的所有类的超类InputStreamReader、OutputStreamWriter处理字符流的抽象类,字节流与字符流转换的桥梁BufferedReader、BufferedWriterBufferedReader:由Reader类扩展而来,提供通用的缓冲方式文本读取,readLine读取一个文本行,从字符输入流中读取文本,缓冲各个字符,从而提供字符、数组和行的高效读取。BufferedWriter:由Writer类扩展而来,提供通用的缓冲方式文本写入,newLine使用平台自己的行分隔符,将文本写入字符输出流,缓冲各个字符,且可以设置缓冲大小,从而提供单个字符、数组和字符串的高效写入PrintWriter提供println()方法可以写不同平台的换行符通过TCP协议的Socket服务端和客户端通信模型如图9-4所示,实现步骤如下:(1)服务端创建ServerSocket;(2)服务端通过调用accept()方法开启监听,等待接收客户端请求;客户端创建链接Socket向服务端发送请求;(3)服务端接收到来自于客户端的请求后,创建链接Socket;(4)客户端和服务端通过输入输出流实现数据交互,客户端和服务端通信结束后,调用close()方法关闭Socket与相关资源。图9-4Socket服务端和客户端通信模型(通过TCP协议)在Socket通信过程中服务端执行步骤为:(1)创建ServerSocket对象,绑定监听的端口;(2)调用accept()方法监听客户端的请求;(3)连接建立后,通过输入流读取客户端发送的请求信息;(4)通过输出流向客户端发送响应信息;(5)关闭相关资源。客户端执行步骤为:(1)创建Socket对象,指明需要链接的服务器的地址和端号;(2)链接建立后,通过输出流向服务器发送请求信息;(3)通过输入流获取服务器响应的信息;(4)关闭相关资源。案例9.2
通过TCP实现网络通信(参考代码见:web模块下com.example.web.tcp包中)依次运行TcpServer和TcpClient,TCP客户端发送信息“我是客户端”,TCP服务端输出的信息如图9-5(a)所示,TCP服务端发送信息“我是服务端”,TCP客户端输出的信息如图9-5(b)所示,TCP客户端和服务端实现相互通信。图9-5(a)TCP服务端输出的信息图9-5(b)TCP客户端输出的信息9.3HTTP通信在浏览器的地址栏里输入的网站地址叫做URL(UniformResourceLocator,统一资源定位符),每个网页也都有一个Internet地址。当我们在浏览器的地址框中输入一个URL或是单击一个超级链接时,URL就确定了要浏览的地址。浏览器通过超文本传输协议(HTTP),将Web服务器上站点的网页代码提取出来进行显示。URL的组成为:协议名://域名:端口/路径/文件名,例如:8080/zhangsan/index.html,含义如下:(1)http://:代表超文本传输协议,通知服务器显示Web页;(2)www:代表一个Web(万维网)服务器;(3):8080/:这是装有网页的服务器的域名(或站点服务器的名称)和端口;(4)zhangsan/:为该服务器上的子目录;(5)index.html:是文件夹中的一个HTML文件。9.3.1HTTP请求消息
用户在浏览器中访问URL或是单击一个超级链接时,浏览器会向服务器发送HTTP请求,浏览器发送到服务器的消息叫做HTTP请求消息(又叫HTTP请求报文),请求消息由请求行、请求头部、空行和请求体四部分组成请求行由请求方式、URL和HTTP协议版本3个部分组成。请求头部用来描述客户端的基本信息,从而把客户端相关的信息告知服务器。请求头部由多个键值对组成,常见的请求头字段如表9-5所示。最后一个请求头字段后面是一个空行,用来分割请求头部和请求体,不过一些浏览器调试工具中经过美化后这个空行没有显示出来,可以看作用一条横线代替。请求体中存放的,是要通过POST方式提交到服务器的数据,由于GET请求是从服务器获取数据,所以GET请求没有请求体。表9-5常见的请求头字段头部字段说明Host指定资源所在的服务器主机名和端口号Connection客户端与服务器之间的连接状态Content-Length请求体大小Content-Type客户端告知服务器实际发送的数据类型Accept客户端可识别的响应内容MIME类型列表Accept-Encoding客户端能进行解码的的数据解码方式Accept-Language客户端期望服务器返回那个国家语言的文档User-Agent即用户代理,指定客户端客户端使用的操作系统及版本、浏览器及版本、浏览语言等,使得服务器针对不同类型的浏览器返回不同内容9.3.2响应消息
服务器接收到请求消息后,会将处理后的数据交给客户端,及HTTP响应消息,响应消息由状态行、响应头部、空行和响应体4个部分组成。状态行位于响应消息的第一行,由HTTP协议版本、状态码、状态码的描述文本3个部分组成,客户端可根据服务器返回的响应状态码得知此次HTTP请求的结果时否成功,也可以根据状态码的类型分析除此次请求不成功的错误原因,状态码第一位数字有5种取值。表9-6状态码取值及描述信息状态码取值描述1xx信息,服务器收到请求,需要请求者继续执行操作2xx成功,请求成功被服务器接收并处理3xx重定向,需要进一步的操作以完成请求4xx客户端请求错误5xx服务器错误,服务器在处理请求的过程中发生错误响应头部用来描述服务器的基本信息,响应头部由多个键值对组成,常用的响应头字段及其描述如表9-7所示,更多的响应头字段的描述,可以查看MDN官方文档:/zh-CN/docs/Web/HTTP/Headers。响应体中存放的,是服务器响应给客户端的资源内容,可以通过浏览器调试工具中的Response面板查看服务器响应回来的内容,响应体可以包含各种类型的数据,如HTML文档、JSON数据、文件等。表9-7常用的响应头字段和说明头部字段说明Age对象在缓存代理中存贮的时长,以秒为单位Location需要将页面重新定向至的地址,为一个使用绝对路径的地址,一般在响应码为3xx的响应中才会有意义Server处理请求的源头服务器所用到的软件相关信息Accept-Ranges服务器使用HTTP响应头Accept-Ranges标识自身支持范围请求,单位值为bytes或者noneContent-Disposition在常规的HTTP应答中,Content-Disposition响应标头指示回复的内容该以何种形式展示,是以内联的形式(即网页或者页面的一部分),还是以附件的形式下载并保存到本地。Vary描述了除方法和URL之外影响响应内容的请求头字段名。9.3.3HTTP通信
HTTP实际上是基于TCP的应用层协议,它在更高的层次封装了TCP的使用细节,使网络请求操作更为易用。TCP连接是因特网上基于流的可靠连接,它为HTTP提供了一条可靠的比特传输管道,从TCP连接一端填入的字节会从另一端以原有的顺序,正确地传递出来。表9-8HttpURLConnection类成员方法及说明方法名说明intgetResponseCode()从HTTP响应消息获取状态码voidsetRequestMethod(Stringmethod)设置发送请求的方法StringgetRequestMethod()获取发送请求的方法voidsetRequestProperty(Stringkey,Stringvalue)设置HTTP请求的请求头StringgetResponseMessage()获取服务器的响应消息(如果有)HttpURLConnection这个类位于包中,是Java的标准类,对外提供访问HTTP协议的基本功能,继承自URLConnection,可用于向网站发送GET和POST请求。案例9.3
通过HTTP实现网络通信访问豆瓣电影首页:/并返回网页源代码。(参考代码见:web模块下com.example.web.http包中)网页源代码即一个网站的原始代码,这些代码是用HTML(超文本标记语言)编写的,源代码是未编译的文本代码,可以通过浏览器或服务器翻译成网站最终显示的内容,浏览器和服务器对这些代码进行解释和渲染,从而在网页上显示我们看见的内容,那么怎么从网页源代码提取我们想要的有用信息呢?对网页源代码解析的工具这里选择Jsoup。Jsoup可从从Jsoup官网:/download下载对应的j
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 注册会计师审计中审计证据充分性适当性的判断标准
- 高考语文作文人类命运共同体素材+范文
- 江苏省2025-2026学年高二下学期3月月考语文试卷及参考答案
- 某玻璃厂生产成本降低细则
- 某石油化工厂设备运行办法
- 某印刷厂生产安全办法
- 上篇 模块二 工业机器人维护常用工具与基本技能
- 2026河南洛阳市孟津区中医院卫生专业技术人员招聘36人备考题库及参考答案详解(研优卷)
- 2026云南玉溪易门县科学技术协会招聘2人备考题库及答案详解【各地真题】
- 2026西藏技师学院锅炉兼综合维修工岗位补聘1人备考题库及参考答案详解(突破训练)
- 2025河北林业和草原局事业单位笔试试题及答案
- 黑龙江哈尔滨德强学校2025-2026学年度六年级(五四制)下学期阶段学情调研语文试题(含答案)
- 2026年温州市瓯海区专职社区工作者公开招聘6人笔试参考试题及答案解析
- 医养结合模式下的老年护理策略
- 2026年社会工作者初级真题及答案
- 酒店建设工作方案
- 2026浙江省公安厅警务辅助人员招聘137人备考题库及答案详解(真题汇编)
- (一模)2026年河南省五市高三第一次联考语文试卷(含答案详解)
- 2026年山西经贸职业学院单招职业适应性测试题库及答案详解(历年真题)
- 重庆市一中高2026届高三3月月考英语试卷(含答案)
- 2026年商丘学院单招综合素质考试题库及答案详解(历年真题)
评论
0/150
提交评论