230 likes | 354 Views
计算机网络 第七讲 客户 / 服务器编程 (Chapter26-28). 房鼎益 电子邮件: dyf@nwu.edu.cn. 计算机网络 第 26 章 客户 / 服务器交互. 第 26 章 客户 / 服务器交互. 应用层概述 客户 / 服务器交互概念 需要澄清的几个概念 标识一个特定服务 并发服务器.
E N D
计算机网络第七讲 客户/服务器编程(Chapter26-28) 房鼎益 电子邮件:dyf@nwu.edu.cn
计算机网络 第26章 客户/服务器交互 第26章客户/服务器交互 • 应用层概述 • 客户/服务器交互概念 • 需要澄清的几个概念 • 标识一个特定服务 • 并发服务器
计算机网络 第26章客户/服务器编程 应用层概述 • 应用层提供面向用户的服务 • 应用层利用底层协议提供的服务进行通信 • 通用的可靠数据传输服务 • 寻址(主机、应用程序)服务 • 应用程序之间的通信都使用同一种交互方式,这种交互方式称为客户/服务器(Client/Server)模式。
计算机网络 第26章客户/服务器编程 客户/服务器交互概念(1) • 客户/服务器交互:客户应用主动地启动通信,而服务器应用被动地等待。 • 客户端软件的特性: • 是一个普通的应用程序 • 在用户的计算机上本地运行 • 直接被用户调用,可分时访问多个服务 • 主动地与服务器启动通信 • 不需要特殊的硬件和高级的操作系统
计算机网络 第26章客户/服务器编程 客户/服务器交互概念(2) • 服务器软件的特性: • 是一种专门用来提供某一种服务的程序 • 在一台共享计算机上运行 • 在系统初启时自动启动,可以同时与多个远程客户进行通信 • 被动地等待来自任意客户的通信 • 需要强大的硬件和高级的操作系统支持
计算机网络 第26章客户/服务器编程 几个需要澄清的概念 • 服务器:指一个被动地等待通信的程序。 • 服务器级计算机:具有快速CPU、大存储量和强大操作系统的计算机。 • 一台服务器级计算机可以提供多重服务,以共享资源,减小开销,便于管理。 • 服务器程序既可以接收信息也能发送信息,还可以成为客户。 • 客户并不限于访问一种服务器。
计算机网络 第26章客户/服务器编程 客户/服务器交互—服务标识(service ID) • TCP赋予每个服务一个唯一的协议端口号。服务器通过协议端口号来指定它所提供的服务,然后被动地等待通信。 • 客户在发送请求时通过协议端口号来指定它所希望的服务。服务器端计算机通过此端口号将收到的请求转发给正确的服务器。 • 每一个会话由两个标识唯一确定:服务器和客户端的(IP地址,端口号)。客户端的端口号可以是任意选定,但必须唯一。
计算机网络 第26章客户/服务器编程 客户/服务器交互——并发服务 • 并发服务器是指一个服务器可以同时为多个客户提供服务。 • 服务器在每一个客户请求到来时创建一个新的线程。如果有N个客户正在使用一台机器上的服务,则存在N+1个提供该服务的线程:主线程等待更多的请求,同时有N个从线程分别同一个客户进行交互。 • 服务器端使用客户标识和服务器标识的结合来选择正确的并发服务器的副本。
计算机网络 第27章套接字接口 第27章套接字(socket)接口 • 套接字API概念 • 实现套接字API的过程 • 用套接字进行读写 • 其它套接字过程 • 套接字、线程与继承
计算机网络 第27章套接字接口 套接字接口概念 • API: 应用程序通过传输协议进行交互时所使用的接口称为应用程序接口(API)。 • 通信协议只定义API应当提供的一般操作,而让操作系统来定义完成这些操作的API规范。API允许应用程序在不同平台兼容。 • 套接字API最初是BSD UNIX操作系统的一部分,后来成为工业界事实上的标准。 • 应用程序通过套接字进行通信的过程,与应用程序与文件进行数据交换是很相似的。
计算机网络 第27章 套接字接口 套接字接口的过程 • SOCKET:创建一个新的套接字 • BIND:给服务器绑定一个传输层地址 • LISTEN:将服务器设为被动模式。 • ACCEPT:接收客户的一个请求 • CONNET:客户向服务器发起连接 • SEND:向一个连接的套接字发送数据 • RECV:从一个连接的套接字接收数据 • CLOSE:终止一个连接
计算机网络 第27章套接字接口 用套接字进行读写 • 套接字允许使用read和write进行数据传输 • read和write有三个参数:套接字描述符,缓冲区,缓冲区长度 • read和write必须用于已连接的套接字 • 使用read和write的优点是应用程序可以同一个描述符进行数据传输,而无需知道此描述符对应的是一个文件还是一个套接字。因此可以用本地文件来测试套接字。
计算机网络 第27章 套接字接口 其它套接字过程 • Getsockname:获得套接字本地完整地址。 • Getpeername:获得套接字远端完整地址。 • Getsockopt:获得当前套接字选项。 • Setsockopt:设置当前套接字选项。 • Gethostbyname:由计算机名字获得IP地址。 • Gethostbyaddr:由IP地址获得计算机名字。 • Getprotobyname:由协议名字得到协议号。
计算机网络 第27章 套接字接口 套接字、线程与继承 • 每个新创建的线程从创建它的线程继承所有套接字的一个副本。 • 服务器主线程为每一个连接的客户创建一个新的套接字和新线程。 • 主线程关闭新套接字,新线程关闭旧套接字。 • 系统对套接字的引用进行计数,计数器为0才能删除套接字。
计算机网络 第28章客户/服务器编程 第28章客户/服务器编程实例 • 面向连接的通信 • 流服务与多重recv调用 • 套接字过程与阻塞 • 客户访问不同的服务 • 其它客户访问服务器 • 无连接的通信
计算机网络 第28章客户/服务器编程 编程实例——面向连接的通信
计算机网络 第28章客户/服务器编程 编程实例——面向连接的通信 MS Socket
计算机网络 第28章客户/服务器编程 流服务与多重recv调用 • 在服务器端,只调用了一次send()。 • 在客户端,循环调用recv()接收数据。 • TCP并不保证数据在单个数据段中发出。 • TCP也不保证recv返回的恰好是send所传送的数据量。 • TCP保证send将数据依次发送 • TCP保证recv调用返回一个或多个数据。
计算机网络 第28章客户/服务器编程 套接字过程与阻塞 • 在程序调用套接字过程时,程序会因为套接字过程需要等待其它资源或过程而被挂起(阻塞)。 • 程序被挂起时不使用CPU时间,挂起时间可以任意长。 • 阻塞过程有:accept, connect, send, recv, gethostbyname等。
计算机网络 第28章客户/服务器编程 测试客户/服务器程序 • 可以去访问其它的服务器来测试客户。 • 可以使用telnet客户程序测试服务器。
计算机网络 第28章客户/服务器编程 编程实例——无连接的通信
计算机网络 第28章客户/服务器编程 编程实例——无连接的通信 MS Socket
计算机网络 第28章客户/服务器编程 实验3 1、写一个时间服务器和客户程序,即客户从服务器获取时间并以用户友好方式显示。 要用到的特殊头文件<time.h>中的函数 time_t time(time_t *),单位是秒。 char * ctime(const time_t *)格式为: