计算机通信与实验_第1页
计算机通信与实验_第2页
计算机通信与实验_第3页
计算机通信与实验_第4页
计算机通信与实验_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第七章基本网络开发技术,2,7.1网络应用开发的基础知识7.2C/S编程模式和套接字7.3B/S编程模式及相关技术7.4习题,基本网络开发技术,3,网络应用开发的基础知识,7.1网络应用开发的基础知识7.1.1服务器和客户的概念7.1.2标示网络应用网络应用的定位地址7.1.3两类不同的编程模式,4,服务器和客户的概念,一般地,把那些提供网络服务的应用程序称为服务器程序(也可简称为服务器),接受网络服务的应用程序称为客户程序(也可简称为客户),它们之间的通信交换称为客户服务器交互模式(Client-serverParadigmofInteraction),简称C/S模式,或C/S结构。通常地,这个术语指一个被动地等待通信的、能够提供某种网络服务的程序,而不是运行它的计算机。然而,当一台计算机被用来运行一个或几个服务器程序时,这台计算机本身有时也被称作服务器。准确地说,服务器(Server)这个术语来指那些运行的程序而不是计算机。,5,标示网络应用网络应用的定位地址,应用的网络定位地址=计算机的IP地址+应用对应的TCP/UDP端口号,6,标示网络应用网络应用的定位地址,常见应用服务的端口,7,两类不同的编程模式,C/S模式绝大部分的网络应用程序从根本上而言都是C/S模式.C/S模式下,一个应用通常包含了两部分程序:服务器程序和客户程序,它们需要分别安装、设置。对于普通的计算机用户而言,为了获取网络服务就必须安装和设置特定的客户程序,未免要求过高。B/S模式客户机统一,浏览器(Browser)成为通用的客户端,网络开发只需要开发服务器端,用户计算机上也不需要为每一个网络应用各安装、设置一个客户端软件,大大简化了网络应用的开发和部署。这种更为便利的开发方式逐步流行,称之为浏览器/服务器交互模式(Browser-serverParadigmofInteraction),简称B/S模式,。,8,C/S编程模式和套接字,7.2.1C/S编程模式7.2.2套接字接口7.2.3实现套接字API的过程7.2.4套接字API的应用示例,9,C/S编程模式,对于一个服务器程序而言,在同一时刻可能有多个客户来请求服务,这时有两种方案:方案1:很自然可以想到,下一个客户获得服务必须等待前一个客户服务结束,以文件传输服务为例,如果用户请求的文件很小,服务器在用户不能觉察的时间内就可以完成服务,方案1可以很好工作。但如果用户请求的文件很大,大到服务器需要几分钟、几十分钟甚至更长的时间才能完成服务,对排队等候的用户而言可能就无法忍受了。方案2:显然是更理想的方式,这时因为有多个客户,需要多个(同样种)服务器提供服务,也就是在运行服务器的计算机上必须同时运行多个服务器应用,这就是并发。并发需要操作系统的支持,今天的操作系统都能满足。再拿文件服务来举例,虽然只有一个文件服务的服务器应用程序,但同一时刻计算机把它运行了多次,每一个运行着的服务器为一个客户提供客户需要的文件服务。一个运行着的服务器可以称为服务器的一个控制线程。动态创建:也就是服务器在每个请求到来时创建一个新的控制线程来提供服务,它与已有的控制线程并发工作。,10,C/S编程模式,一个服务器应用程序由两部分组成:一部分负责接收请求和生成新控制线程,另一部分包含处理单个请求完成服务的代码。在服务器程序设计时,必须考虑到并发的情况,并通过动态创建来解决这个问题。,11,C/S编程模式,服务器同时又多个控制线程工作,客户如何找到属于自己的线程并与它交互呢?拿TCP来说,客户的请求中包含了:目的IP,目的TCP端口号,源IP,源TCP端口号,目的IP帮助客户找到正确的提供服务的计算机,目的TCP端口号为客户在目的计算机上的不同类型服务器中找到正确的服务器程序,而源IP和源TCP端口号则成为为这个客户启动的控制线程的标识,服务器通过它们使正确的控制线程与正确的客户交互。,12,套接字接口,套接字是从英文单词socket翻译而来,它是网络通信的基本构件。可以把套接字想象成连接应用和底层网络实现的“门”,发送信息的一方把信息送出“门”,底层的网络实现保证信息正确无误地到达接收发的“门”口供接收.套接字是网络传输资源的描述符(指针)。套接字最早是U.C.Berkeley大学BSDUNIX系统中的一部分,13,以WindowsSockets为例来看看应用程序与socket之间的关系,如下图:,套接字接口,14,1Socket过程2Close过程3Bind过程4Listen过程5Accept过程6Connect过程7Send、Sendto与Sendmsg过程8Recv、Recvfrom与Recvmsg过程9辅助过程,实现套接字API的过程,15,实现套接字API的过程,下图给出了最简单的服务器和客户套接字API过程。,16,1Socket过程Socket过程创建一个套接字,返回一个整型描述符:descriptor=socket(protocolfamilY,type,protocol)参数protocolfamily表示:套接字使用的协议簇。例如,值PF_INET表示TCP/IP协议系列。参数type表示:套接字所使用通信的类型。两个最常用的类型是面向连接的流传输(用值SOCK_STREAM表示)和无连接的面向消息传输(用值SOCK_DGRAM表示)。参数protocol:表示套接字所使用的特定传输协议。在type参数后加上protocol参数允许单个协议系列包括两个或多个提供同一个服务的协议。当然,protocol参数所能取的值取决于协议簇。例如,TCP/IP协议系列包含了TCP协议,而其他的系列并不包含。,实现套接字API的过程,17,2Close过程close过程告诉系统终止对一个套接字的使用(Windows的套接字接口用closesocket而不是close)。它的形式为:close(socket)其中socket是要关闭的套接字的描述符。如果该套接字使用的是面向连接的传输协议,close在关闭套接字前先终止连接。关闭一个套接字意味着立即终止对它的使用描述符被释放,以防止应用程序发送更多的数据;传输协议也停止接收指向该套接字的信息,以防止应用程序接收更多的数据。,实现套接字API的过程,18,3Bind过程服务器使用bind过程提供一个协议端口号,并通过它等待通信。bind有三个参数:bind(socket,localaddr,addrlen)参数socket是一个套接字的描述符参数localaddr是一个结构,参数addrlen是一个整数,指出地址的长度。,实现套接字API的过程,19,3Bind过程这个表示地址的一般格式被定义为一个sockaddr结构。它已经推出了许多版本,最近的伯克利代码定义的sockaddr结构包含三个域:structsockaddru_charsa_len;/*地址总长*/u_charsa_family;/*地址簇*/charsa_data14;/*地址本身*/;sa_len域表示地址长度。sa_family域表示地址所属的协议簇(字符常量AF_INET表示TCP/IP地址)。最后,sa_data域包含地址。每个协议簇为sockaddr结构中的sa_data域定义自己的精确格式。,实现套接字API的过程,20,3Bind过程例如,TCP/IP协议使用sockaddr_in来定义地址:structsockaddr_inu_charsin_len;/*地址总长*/u_charsin_family;/*地址簇*/u_shortsin_port;/*协议端口号*/structin_addrsin_addr;/*计算机IP地址*/charsin_zero8;/*未用(置为0)*/;sockaddr_in结构的前两个域正好对应一般的sockaddr结构的前两个域,后三个域定义了TCP/IP协议所希望的确切地址格式。,实现套接字API的过程,21,3Bind过程有两点值得注意:第一,每个地址标识了一台计算机以及该计算机上的一个特定应用。sin_addr域包含这台计算机的IP地址,而sin_port域包含这个应用的协议端口号。第二,尽管TCP/IP只需要六个字节来存放整个地址,一般的sockaddr结构仍保留了十四字节。于是,最终的sockaddr_in结构中包含一个8个字节的全0的域,以使该结构在大小上与sockaddr相同。除了协议端口号外,sockaddr_in结构还包含一个记录IP地址的域。sockaddr_in结构定义了TCP/IP使用的地址表示格式。尽管该结构包含了IP地址的域和协议端口号的域,套接字API仍包含了一个字符常量来允许服务器对该计算机上的任一IP地址指定一个协议端口。,实现套接字API的过程,22,4Listen过程在说明了一个协议端口后,服务器必须通知操作系统将这个套接字设为被动模式以使它能被用来等待客户的通信。为了做到这一点,服务器调用listen过程,它有两个参数:listen(socket,queuesize)参数socket是套接字的描述符,它已经被创建并绑定于一个本地地址。参数queuesize表示该套接字的请求队列的长度。,实现套接字API的过程,23,5Accept过程连接传输协议的服务器必须调用accept过程来接受下一个连接请求。如果队列中已经有请求,accept立即返回;如果还没有请求到达,系统挂起服务器直至有客户建立连接。accept调用的形式为:newsock=accept(socket,caddress,caddresslen)参数socket是服务器已经创建并绑定于指定协议端口的套接字的描述符。参数caddress是sockaddr类型结构的地址,而caddresslen则是一个指向整型的指针。accept在参数caddress的域中填入建立连接的客户的地址,并设caddresslen为地址长度。,实现套接字API的过程,24,6Connect过程客户使用connect过程与指定服务器建立连接。形式为:connect(socket,saddress,saddresslen)参数socket是客户端计算机上用于该连接的套接字的描述符。参数saddress是一个sockaddr结构,说明服务器地址与协议端口号(IP地址和协议端口号合在一起有时被称作端地址,即endpointaddress)。参数saddresslen是以字节形式说明的服务器地址的长度。当使用TCP这样的面向连接的传输协议时,connect启动一个指定服务器的传输层连接。一般来说,connect是客户用来与已经调用了accept的服务器进行连接的过程。,实现套接字API的过程,25,7Send、Sendto与Sendmsg过程客户与服务器都需要发送信息。通常客户发送请求,服务器发送应答。如果套接字已连接,send过程可用来传输数据。send有四个参数:send(socket,data,length,flag)参数socket是使用的套接字的描述符。参数data是待发送数据在内存中的地址。参数length是一个整型数,表示数据的字节数,而参数flag则包含了请求特殊选项的位(许多选项是为系统调试设计的,并不能被普通的客户和服务器程序使用)。,实现套接字API的过程,26,7Send、Sendto与Sendmsg过程Sendto与Sendmsg过程允许客户或服务器使用一个未连接的套接字发送信息,两者都需要调用者说明目的地。Sendto将目的地地址作为参数。它的形式为:sendto(socket,data,length,flag,destaddress,addresslen)前四个参数对应于send过程的四个参数。后两个参数说明目的地地址与该地址的长度。参数destaddress的类型为sockaddr结构(特别地,在TCP/IP中为sockaddr_in结构)。,实现套接字API的过程,27,7Send、Sendto与Sendmsg过程Sendmsg过程完成与Sendto过程相同的操作,但通过定义结构简化了参数。这种较短的参数表使使用Sendmsg的程序更易读:sendmsg(socket,msgstruct,flag)参数msgstruct是一个包括关于目的地地址、该地址长度、待发送信息及该信息长度等内容的结构:structmsgstruct/*sendmsg使用的结构*/structsockaddr*m_saddr;/*目的地地址指针*/structdatavec*m_dvec;/*信息(向量)指针*/intm_dvlength;/*向量中项数*/structaccess*m_rights;/*访问权表指针*/intm_alength;/*表中项数*/;大多数应用仅仅使用前三个域,说明目的地协议地址和一列组成该信息的数据项。,实现套接字API的过程,28,8Recv、Recvfrom与Recvmsg过程客户与服务器都需要接收发自另一方的数据。套接字API提供了一些可用的过程。例如,一个应用可以调用recv从一个连接的套接字接收数据。这个过程的形式为:recv(socket,buffer,length,flags)参数socket是从中接收数据的套接字的描述符。参数buffer表示用来存放接收到的数据的内存地址。参数length则表示这个缓冲区的大小。参数flag允许调用者控制一些细节(例如,允许应用在不将信息从套接字中移出的情况下提取它的一个副本等)。,实现套接字API的过程,29,8Recv、Recvfrom与Recvmsg过程如果一个套接字未连接,它可被用来接收从任意一组客户发来的信息。在这种情况下,系统返回每个接收到的信息和发送方地址。应用使用Recvfrom过程接收信息及发送方地址:recvfrom(socket,buffer,length,flags,sndraddr,saddrlen)前四个参数对应于recv过程的参数,剩下的两个参数sndraddr和saddrlen用来记录发送方的IP地址。参数sndraddr是sockaddr结构的指针,系统将发送方地址写入其中参数saddrlen是一个整型的指针,系统用它来记录地址的长度。Recvfrom记录的发送方地址与sendto所期望的完全相同。如果一个应用使用Recvfrom来接收一个信息,发送一个回答将是十分容易的应用只需简单地在回答中将记录的地址作为目的地即可。,实现套接字API的过程,30,8Recv、Recvfrom与Recvmsg过程套接字API包含了一个与sendmsg输出过程相似的输入过程。Recvmsg过程所做的操作类似于Recvfrom,但需要较少的参数。它的形式为:recvmsg(socket,msgstruct,flags)参数msgstruct给出了一个结构的地址,这个结构包含了接收到的信息的地址与发送方的IP地址。Recvmsg所记录的结构的格式与sendmsg所要求的完全一样。这样,这两个过程在接收信息与发送应答时能很好地配合。,实现套接字API的过程,31,实现套接字API的过程,9辅助过程服务器在调用accept过程接收连接请求之后,它可以调用getpeername过程来获得启动连接的客户的完整地址。应用程序可以调用setsockopt过程存储套接字选项,getsockopt获得当前选项值。选项主要用来处理特殊情况(例如,通过改变协议软件使用的内部缓冲区大小来提高性能等)。有两个过程可用来在IP地址和计算机名之间进行转换。gethostbyname过程通过计算机名字返回该计算机的IP地址。客户经常使用gethostbyname将用户输入的名字转换成相应的协议软件所需的IP地址。gethostbyaddr提供一个反向的映射给出一台计算机的IP地址,它将返回该计算机的名字。客户与服务器可以在向人显示信息时使用gethostbyaddr。,32,套接字API的应用示例,这个例子包含服务器和客户两个部分,服务器打开一个TCP端口,绑定到本地地址上去,等待客户的连接,客户的连接被服务器接受后,服务器发送信息到客户并关闭这次连接、等待下一个客户的连接。客户接收到信息后,显示在终端上,结束客户程序。,2服务器代码/*server.c-使用TCP的服务器程序实例代码*/#ifndefWIN32#defineclosesocketclose#include#include#include#include.详细,1客户代码/*client.c-使用TCP的客户程序实例代码*/#ifndefWIN32#defineclosesocketclose#include#include.详细,33,B/S编程模式及相关技术,7.3.1Web基础知识7.3.2MVC思想和在Web开发中的使用7.3.3Web编程语言中的通用概念7.3.4Web编程的例子,34,Web基础知识,1统一资源定位器2Web服务器与浏览器3理解HTTP4HTML,35,统一资源定位器,URL可以分为以下几部分:Protocol:/(协议)Servername.domain(服务器名.域)directory/(目录)file(文件),36,统一资源定位器,其他常见的URL为:ftp:/服务器域名/目录/文件。ftp:/用户名服务器域名/目录/文件。telnet:/服务器域名。news:/新闻服务器域名/新闻组。,37,用户可以使用URL向服务器传递数据。典型应用为向服务器方函数传递参数。例如:http:/服务器域名/目录/文件/file.html?用户名Jamison,53,Web编程语言中的通用概念,2Response与Request对应,Response则包含了一次HTTP相应的所有信息,如把HTML发送给浏览器、重定向用户请求等。,如在ASP中可以这样把一个信息发送给浏览器:在JSP里Response的输出必须用out来写,所以上面的语法到JSP里为:,Response.write”Helloworld!”,out.print(”Helloworld!”);,54,Web编程语言中的通用概念,3.Application/ContextApplication常常指一次Web服务器的启动环境,包含了与这一次启动有关的任何数据,它为所有在这次启动中的客户所共有。如一个很简单的聊天程序用ASP来实现可以这样来写,一个用户使用以下语句把信息写入Application:Application(”chatinfo”)=”Helloeverybody!”其他用户可以简单地通过引用Application(“chatinfo”),就可以取到这条信息:Response.writeApplication(”chatinfo”),55,Web编程语言中的通用概念,4.SessionWeb编程语言使用Session的概念来说明客户的一次连续访问.同一时刻来自不同客户IP地址的请求也会被看作是不同的多个Session。每个Session,系统都会分配一个SessionID给它来标示自己,在ASP中存取Session变量的方法如下:Session(”userName”)=”张三”Response.writeSession(”userName”)每个客户都可以在Session的userName中存储自己的姓名,每次取出时也只能取出自己的。,56,Web编程语言中的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论