




已阅读5页,还剩47页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第三章互联网应用和网络编程 3 1介绍互联网提供的是一个一般性的通讯机制 基于互联网的各种服务都是由连接在互联网上的计算机中应用程序提供的 3 2两个基本互联网通讯范例 两个基本互联网通讯范例 流范例和消息范例 3 2 1互联网中的流传输 流 表示了一个通讯范例 即 一序列字节重一个应用程序流向另一个应用程序 一般 流是双向的 如 浏览器发出网页请求 服务员程序返回网页 互联网只是接受来自一个应用程序的输入 并将该数据送到另一个应用程序 3 2 1互联网中的流传输 2 流机制传输一序列字节 不包含字节的意义和字节间的界限 特别是 发送方应用程序可以一次发一个字节 或一次发一组字节 网络随时选择发送的字节数 可以将小的数据块组合成大的 也可将大的数据块分成小的 所以 互联网不保证发送的数据块和接收到的数据块一样大 3 2 2互联网中的消息传输 互联网另一个传输机制是消息传输 网络以 消息 为单位收发 网络从不将一个消息拆分 也不将消息组合在一起 接收方收到的消息和发送方发送的一样 消息发送可以点对点传输 组播和广播发送 即 1 1 1 多 或多 1通讯 消息服务不保证消息提供的顺序 或者确保消息的到达 3 2 2互联网中的消息传输 2 消息服务允许消息 丢失 即 从没提供 重复 即 不止一个拷贝到达 乱序选择消息范例的编程者一定要确保 即使消息丢失或乱序 应用程序也能正确操作 由于大多数的应用程序要求可靠的信息提供 所以 一般程序员选择流服务 但是 像视频 需要组播的程序 就要用消息服务 这样 应用程序就要处理数据包的乱序和丢失的问题 3 3面向连接的通讯 互联网的流服务是面向连接的 意思是 就像打电话 通讯前 两个应用程序要求建立连接一旦连接建立了 才允许应用程序间发送 接收数据最后 当完成通讯时 要求应用程序断开连接 3 4网络互动中的客户 服务员模式 CS模式 两台独立的计算机上的两个应用程序 如何相互协调以保证 它们同时需要一个连接 这就是称为 客户 服务员模式 的一种互动方式 其中 服务员程序 首先启动 等待连接客户端程序 后启动 发起连接 3 4网络互动中的客户 服务员模式 CS模式 2 所以 虽然互联网提供基本的通讯 但是 互联网不向远端的计算机发起连接 或接受来远端计算机自连接 那些都是由称为 服务员程序 和 客户端程序 的应用程序来处理 3 5 服务员程序 和 客户端程序 的特点 客户端程序的特点 当需要远程访问时 任何程序都可以临时变成客户端程序 但 仍可以进行其他计算客户端程序是由用户直接启动 并只执行一个会话客户端程序是在用户的个人电脑上就地运行主动地启动与服务员程序的连接根据需要能够访问多个服务 但是 一般地 一次只与一个远程服务员程序联系不需要特别高性能的计算机硬件 服务员程序的特点 服务员程序是一个特定目的的 特权程序 只用于提供一个服务 但 该服务同时能够处理多个远程客户端程序当系统启动时 服务员程序是自动启动的 继续通过多个会话来执行在一个大型 高性能的计算机上运行被动地等待来自远程任意客户端程序的连接虽然接受任意客户端程序的连接 但是 只提供单一服务要求高性能的硬件 和成熟的操作系统 3 6服务员程序和服务员级的计算机 服务器 3 7请求 响应和数据流向 建立了连接之后 客户端程序要先发出请求 然后 服务员程序给予响应 所以 客户端程序和服务员程序之间 数据的流向可以是单向的 也可以是双向的 3 8多客户端程序和多服务员程序 客户端程序和服务员程序都是由应用程序构成的 一台计算机可以同时运行多个应用程序 结果 一台计算机可以运行 一个客户端程序一个服务员程序客户端程序的多个拷贝 均连接一台给定的服务员程序多个客户端程序 每个连接不同的特定服务员程序多个服务员程序 每个只提供一个特定的服务 3 8多客户端程序和多服务员程序 2 因为服务可以同时访问 所以 一台计算机可以同时运行多个客户端程序 因为计算机的硬件可以共享 所以 一台计算机可以同时操作多个服务员程序 即 如果服务的负荷不高 可以将几个服务员程序合并到一台计算机中 从而 降低费用而性能无明显降低 3 9服务员程序的识别和解复用 Demultiplexing 客户端程序如何识别服务员程序 互联网协议 IP 将服务员程序的身份识别分成两部分 运行服务员程序的计算机的识别在该计算机上 一个特定服务员程序的识别识别一台计算机 32位的互联网协议地址 IPAddress 识别一个服务 16位的协议端口号 protocolportnumber 例如 email 25 web 80 3 9服务员程序的识别和解复用 Demultiplexing 2 3 10并发的服务员程序 所谓并发 就是一个服务员程序使用不止一个控件线程 以同时处理多个客户端程序 基本思想 并发服务员程序代码分两部分 一个主程序 主线程 一个处理程序主程序 主线程 只接受来自客户端程序的连接 并为客户端程序创建一个控件线程每个控件线程与客户端程序交互 并运行处理程序代码控件线程在处理完一个客户端程序后 线程终结主线程始终保持处于激发状态 active 即 在创建一个控件线程后 就等待另一个请求的到来 所以 在有N个客户端程序同时使用并发服务员程序时 有N 1个线程在运行 3 11服务员程序间的环形依赖 从技术上 客户端程序是主动与其他程序联系的程序 而 服务员程序是接受来自其他程序连接的程序 事实上 一个服务员程序在需要其他程序提供信息时 也变成了客户端程序 例如 web服务员程序在提供网页前 动态网页 可能就先成为数据库服务员程序的客户端程序 程序员必须避免服务员程序间的环形依赖关系 例如 X1 X2 X3 X1这种环形请求会不确定的继续下去 直到三台计算机是资源耗尽 这种服务员程序间的环形依赖 在不是一个程序员开发的服务员程序中 潜在的风险很高 3 12对等网络间的 Peer To Peer 互动 一个服务员程序与互联网的连接 成为一个瓶颈 3 12对等网络间的 Peer To Peer 互动 2 如何解决 采用对等网络 Peer To Peer 的体系结构 即 避免把数据放置在一个中央服务器里 将数据分成N份 放在N个服务员程序组 分别放置在N台计算机 里 一个客户端程序的请求会发给响应的服务员程序 这样 通讯量只是中央式服务器的1 N 这时 一台计算机中的服务员程序 也可以是客户端程序 3 13网络编程和套接字应用程序接口 API 应用程序用于通讯的接口 称为应用程序接口 API 其中 以套接字应用程序接口 简称套接字 Socket 为主要技术 3 14套接字 描述符和网络输入 输出 当一个应用程序与互联网通讯时 它首先要建立一个套接字 向操作系统申请 操作系统会返回一个小的整数 长整型 的描述符 Descriptor 来标示该套接字 当应用程序需要通过该套接字执行操作时 只需调用函数 并将描述符作为参数传给该函数即可 3 15参数和套接字应用程序接口 套接字编程与常规输入 输出不同 它要求指定更多的细节 如 远程计算机的地址 协议端口号 以及应用程序是服务员程序还是客户端程序等 为防止套接字应用程序接口 SocketAPI 有太多的参数 设计者将其分成多个函数 实际上 应用程序首先建立套接字 再用函数去细化它 3 15参数和套接字应用程序接口 2 3 16客户端程序和服务员程序中套接字的调用 客户端程序和服务员程序在一个数据流的连接中 典型的套接字调用顺序 3 17由客户端程序和服务员程序共同使用的套接字函数 3 17 1Socket函数功能 Socket函数创建一个套接字并返回一个整型描述符 descriptor socket protofamily type protocol 参数 protofamily表示套接字使用的协议族 例如 值PF INET用来表示TCP IP协议系列 type表示套接字所使用通信的类型 两个最常用的类型是面向连接的流传输 用值SOCK STREAM表示 无连接的面向消息传输 用值SOCK DGRAM表示 protocol表示套接字所使用的特定传输协议 protocol参数允许单个协议族中包括两个或多个协议 来提供同一个服务 protocol参数所能取的值取决于协议族 3 17 2Send函数 客户端程序和服务员程序都用Send函数来传输数据 通常 客户发送请求数据 服务器发送应答数据 Send有四个参数 send socket data length flag 参数 socket是使用的套接字的描述符 data是待发送数据在内存中的地址 指针 length是一个整型数 表示数据的字节数 Flag标志位 包含了需要特殊选项的位 许多选项是为系统调试设计的 并不能被普通的客户和服务器程序使用 3 17 3Recv函数 客户端程序和服务员程序都用Recv函数接收来自另一方的数据 recv socket buffer length flags 参数 socket用于接收数据的套接字的描述符 buffer用来存放接收到的数据的内存地址 指针 length则表示这个缓冲区的大小 flag允许调用者控制一些细节 例如 允许应用程序在不将信息从套接字中移出的情况下提取它的一个拷贝等 Recv函数一直处于阻止 block 状态 直到数据到达 然后 将长度为length的字节数据放置到buffer指定的缓存中 函数调用返回实际提取的字节数 3 17 4带有套接字的Read和Write函数 UNIX系统和Linux系统 对I O操作使用read和write 所以 在该操作系统的函数中 使用read和write进行数据传输 Read函数采用send函数的前三个参数 write函数采用recv函数的前三个参数 使用read和write主要的优点 应用程序调用时 使用描述符 而无需知道该描述符指的是文件 还是套接字 程序员在通过网络进行通信之前能够使用本地盘上的文件来测试客户或服务器程序 使用read和write的主要缺点在使用其他操作系统时 该函数要被换掉 3 17 5Close函数 Close函数通知系统终止对一个套接字的使用 它的形式为 close socket 其中 socket是要关闭的套接字的描述符 如果连接处于打开状态 close在关闭套接字前先终止连接 关闭一个套接字意味着 立即终止对它的使用 描述符被释放 以防止应用程序发送或接收数据 3 18只能由客户端程序使用的连接函数 Connect 客户端程序使用Connect函数与指定服务器建立连接 形式为 connect socket saddress saddresslen 参数 socket是客户端程序用于该连接的套接字的描述符 saddress是一个sockaddr结构体 说明服务员程序的地址与协议端口号 即IP地址和协议端口号 saddresslen是以字节为单位 说明的服务器地址的长度 对于使用流范例的套接字 Connect函数启动一个与指定服务员程序的传输层连接 该服务员程序必须处于等待连接的状态 3 19只能由服务员程序使用的套接字函数 3 19 1Bind函数在套接字被创建之后 套接字中既没有本地地址也没有远程地址 服务员程序调用Bind函数 以提供一个协议端口号 并通过它服务员程序等待连接 Bind有三个参数 bind socket localaddr addrlen 参数 socket是一个套接字的描述符 它已被创建但还未被绑定 这个调用是一个对套接字赋以特定协议端口号的请求 localaddr是一个结构体 它说明了将要赋给套接字的本地地址 addrlen是一个整数 指出地址的长度 3 19 1Bind函数 2 由于套接字可以被任意协议所使用 这个地址的格式取决于所使用的协议 套接字应用程序接口 SocketAPI 定义了一个用来表示地址的一般格式 然后要求每个协议族说明它们的协议地址是如何使用这个一般格式的 3 19 1Bind函数 3 这个表示地址的一般格式被定义为 sockaddr结构体 sockaddr结构体包含三个域 structsockaddr u charsa len 地址总长 u charsa family 地址族 charsa data 14 地址本身 其中 sa len域 有一个8位二进制数构成 表示地址长度 sa family域表示地址所属的协议族 字符常量AF INT表示TCP IP地址 sa data域包含地址 3 19 1Bind函数 4 每个协议族为sockaddr结构中的sa data域定义自己的精确格式 例如 TCP IP协议使用结构体sockaddr in来定义地址 structsockaddr in u charsin len 地址总长 u charsin family 地址族 u shortsin port 协议端口号 2个字节 Structin addrsin addr 计算机IP地址 Charsin zero 8 未用 置为0 sockaddr in结构体中前两个域对应一般的sockaddr结构体的前两个域 后三个域定义了TCP IP协议所希望的确切地址格式 3 19 1Bind函数 5 有两点值得注意 第一 每个地址标识了一台计算机和该计算机上的一个协议端口 sin addr域包含这台计算机的IP地址 sin port域包含协议端口号 第二 尽管TCP IP只需要六个字节来存放整个地址 一般的sockaddr结构仍保留了十四字节 于是 最终的sockaddr in结构体中包含一个8个字节的全0的域 以使该结构在大小上与sockaddr相同 3 19 2Listen函数 在使用bind函数指定了一个协议端口后 服务器必须调用listen函数 将这个套接字设为被动模式 以使套接字准备等待来自客户端程序的连接 listen过程 它有两个参数 listen socket queuesize 参数 socket是套接字的描述符 它已经被创建并绑定于一个本地地址 queuesize表示该套接字的请求队列的长度 3 19 2Listen函数 2 操作系统为每个套接字各自建立一个队列 最初 队列是空的 当来自客户的请求到达时 它们被依次放入队列 当服务器要求从套接字中提取一个到来的请求时 系统队列中返回下一个 请求 队列长度queuesize是很重要的 若队列已满 请求到达时 系统将拒绝该请求 3 19 3Accept函数 服务员程序从调用socket创建一个套接字和调用bind定义一个协议端口号开始 无连接传输协议的服务员程序已准备好接收信息 面向连接传输协议的服务员程序 在接收信息前还需要一些步骤 服务员程序必须调用listen将套接字设为被动模式 然后 必须接受一个连接请求 一旦接受了连接 服务员程序就能够使用该连接与客户进行通信 在通信结束后 服务器关闭这个连接 3 19 3Accept函数 2 使用面向连接传输协议的服务员程序 必须调用Accept函数来接受下一个连接请求 如果队列中已经有请求 Accept立即返回一个请求 如果还没有请求到达 系统将阻止 block 服务员程序 直至有客户端程序启动一个请求 Accept调用的形式为 newsock accept socket caddress caddresslen 参数 socket是服务员程序已经创建并绑定于指定协议端口的套接字的描述符 caddress是sockaddr类型结构的地址 caddresslen是一个指向整型的指针 3 19 3Accept函数 3 Accept在caddress域中填入建立连接的客户的地址 并设caddresslen为地址长度 最后 Accept为该连接创建一个新的套接字 并将这个新的套接字的描述符返回给调用者 然后 服务员程序建立子线程 并发程序 服务员程序 子线程 中 先关闭原始的套接字 该套接字由主线程使用 使用这个新的套接字与客户进行通信 然后 在结束后 关闭该套接字 同时 服务员程序 主线程 的原始套接字保持不变在服务员程序结束 子线程 与一个客户的通信后 子线程关闭新套接字 然后 终止子线程 主线程使用原始的套接字来接收下一个客户端程序的连接 所以 主线程中 最初的套接字只用于接受请求 所有的通讯都是通过由accept建立的新套接字完成的 3 20消息范例使用的套接字函数 发送和接受消息的套接字函数 要比流范例的那些函数复杂 因为 会有更多的参数 如 发送方可以选择是否在套接字中保存接收方的地址 还是 只发送数据或者 每次发送数据时 指定接收方的地址 又如 函数允许 发送方可以将地址和数据放在一个结构体中 将结构体的地址指针作为参数传输给函数 有的函数要求发送方将地址和信息做为独立的参数传输给函数 3 20 1Sendto与Sendmsg套接字函数 Sendto和sendmsg函数允许客户端程序或服务员程序使用一个未连接的套接字发送信息 两者都需要调用者指定目的地 Sendto将目的地地址作为参数 它的形式为 sendto socket data length flag destaddress addresslen 前四个参数对应于sends函数的四个参数 后两个参数说明目的地地址与该地址的长度 参数 destaddress的类型为sockaddr结构体 在TCP IP中 为sockaddr in结构体 3 20 1Sendto与Sendmsg套接字函数 2 Sendmsg函数与Sendto函数有相同的操作 但通过定义结构体简化了参数 sendmsg socket msgstruct flag 参数 msgstruct是一个包括关于目的地地址 该地址长度 待发送信息及该信息长度等内容的结构体 structmsgstruct sendmsg使用的结构 structsockaddr m saddr 指向目的地地址指针 structdatavec m dvec 指向信息 向量 指针 intm dvlength 向量中项数 structaccess m rights 指向访问权列表指针 intm alength 表中项数 大多数应用程序仅仅使用前三个域 说明目的地协议地址和组成信息的数据项列表 以及列表中数据项的数量 3 20 2Recvfrom与Recvmsg函数 一个未连接的套接字 它可被用来接收从任意一组客户发来的信息 在这种情况下 系统返回每个接收到的信息和发送方地址 应用程序使用recvfrom函数接收信息及发送方地址 recvfrom socket buffer length flags sndraddr saddrlen 前四个参数对应于recv过程的参数 剩下的两个参数sndraddr和saddrlen用来记录发送方的IP地址 参数 sndraddr是sockaddr结构体的指针 系统将发送方地址写入其中 saddrlen是一个整型的指针 系统用它来记录地址的长度 3 20 2Recvfrom与Recvmsg函数 2 recvfrom记录的发送方地址与sendto的完全相同 这样 如果一个应用程序使用recvfrom来接收一个信息 发送一个回答将是十分容易的 应用程序只需简单地在回答中将recvfrom记录的源地址作为目的地即可 Recvmsg函数所做的操作与recvfrom类似 但需要较少的参数 它的形式为 recvmsg socket msgstruct flags 参数 msgstruct给出了一个结构体的地址 这个结构包含了接收到的信息的地址与发送方的IP地址 recvmsg所记录的结构体的格式与sendmsg所要求的完全一样 这样 这两个函数在接收信息与发送应答时能很好地配合 3 21其他的套接字函数 服务器在调用accept过程接收连接请求之后 它可以调用getpeername过程来获得启动连接的客户端程序的地址 客户端程序或服务员程序也可以调用gethostname来获得运行于其上的计算机的信息 有两个通用的函数 用来设置套接字选项或获得当前选项值的列表 Socket选项主要用来处理特殊情况 例如 增加内部缓冲区大小等
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025重庆市合川区区农民合作社服务中心有限公司面向社会招聘工作人员4人笔试历年参考题库附带答案详解
- 2025重庆众合智行交通科技有限公司招聘1人笔试历年参考题库附带答案详解
- 2025鄂尔多斯市交通投资有限公司嘎苏段一级公路收费所(苏米图服务区)招聘笔试历年参考题库附带答案详解
- 2025贵州黔西南州安龙县县属国有企业招聘高级管理人员8人笔试历年参考题库附带答案详解
- 2025贵州黔东南州凯丽交通旅游投资(集团)有限责任公司招聘17人笔试历年参考题库附带答案详解
- 2025贵州遵义市大数据集团有限公司招聘工作人员及笔试历年参考题库附带答案详解
- 2025贵州贵阳市水务环境集团有限公司招聘32人笔试历年参考题库附带答案详解
- 2025江苏南京大学医院事业编制和校聘岗位招聘模拟试卷及答案详解(有一套)
- 2025福建福州消防招录政府专职消防指挥员30人笔试历年参考题库附带答案详解
- 2025福建泉州丰泽城建昊丰劳务有限公司招聘国有企业项目制周期性工作人员及环节人员笔试历年参考题库附带答案详解
- DB11∕T 583-2022 扣件式和碗扣式钢管脚手架安全选用技术规程
- 食材配送服务质量保证方案
- 医学细胞生物学细胞的内膜系统
- 《孕前和孕期保健》课件
- 肾病科糖尿病肾病(DKD)与终末期肾病血液透析(ESRD-HD)单病种质量控制统计表
- 空间设计教学大纲 室内设计教学大纲(五篇)
- 促单技巧及话术大全
- 车辆司法鉴定申请书
- 塑料原料名称中英文对照表
- 第十四杂环化合物
- GB/T 5454-1997纺织品燃烧性能试验氧指数法
评论
0/150
提交评论