计算机通信与实验.ppt
第七章 基本网络开发技术,2,7.1 网络应用开发的基础知识7.2 C/S编程模式和套接字7.3 B/S编程模式及相关技术7.4 习 题,基本网络开发技术,3,网络应用开发的基础知识,7.1 网络应用开发的基础知识服务器和客户的概念标示网络应用网络应用的定位地址两类不同的编程模式,4,服务器和客户的概念,一般地,把那些提供网络服务的应用程序称为服务器程序(也可简称为服务器),接受网络服务的应用程序称为客户程序(也可简称为客户),它们之间的通信交换称为客户服务器交互模式(Client-server Paradigm of Interaction),简称C/S模式,或C/S结构。通常地,这个术语指一个被动地等待通信的、能够提供某种网络服务的程序,而不是运行它的计算机。然而,当一台计算机被用来运行一个或几个服务器程序时,这台计算机本身有时也被称作服务器。准确地说,服务器(Server)这个术语来指那些运行的程序而不是计算机。,5,标示网络应用网络应用的定位地址,应用的网络定位地址=计算机的IP地址+应用对应的TCP/UDP端口号,6,标示网络应用网络应用的定位地址,常见应用服务的端口,7,两类不同的编程模式,C/S模式绝大部分的网络应用程序从根本上而言都是C/S模式.C/S模式下,一个应用通常包含了两部分程序:服务器程序和客户程序,它们需要分别安装、设置。对于普通的计算机用户而言,为了获取网络服务就必须安装和设置特定的客户程序,未免要求过高。B/S模式客户机统一,浏览器(Browser)成为通用的客户端,网络开发只需要开发服务器端,用户计算机上也不需要为每一个网络应用各安装、设置一个客户端软件,大大简化了网络应用的开发和部署。这种更为便利的开发方式逐步流行,称之为浏览器/服务器交互模式(Browser-server Paradigm of Interaction),简称B/S模式,。,8,C/S编程模式和套接字,7.2.1 C/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大学BSD UNIX系统中的一部分,13,以Windows Sockets为例来看看应用程序与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参数所能取的值取决于协议簇。例如,T C P/I P协议系列包含了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结构包含三个域:struct sockaddr u_char sa_len;/*地址总长*/u_char sa_family;/*地址簇*/char sa_data14;/*地址本身*/;sa_len域表示地址长度。sa_family域表示地址所属的协议簇(字符常量AF_INET表示TCP/IP地址)。最后,sa_data域包含地址。每个协议簇为sockaddr结构中的sa_data域定义自己的精确格式。,实现套接字API的过程,20,3Bind过程 例如,TCP/IP协议使用sockaddr_in来定义地址:struct sockaddr_in u_char sin_len;/*地址总长*/u_char sin_family;/*地址簇*/u_short sin_port;/*协议端口号*/struct in_addr sin_addr;/*计算机IP地址*/char sin_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地址和协议端口号合在一起有时被称作端地址,即endpoint address)。参数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是一个包括关于目的地地址、该地址长度、待发送信息及该信息长度等内容的结构:struct msgstruct/*sendmsg 使用的结构*/struct sockaddr*m_saddr;/*目的地地址指针*/struct datavec*m_dvec;/*信息(向量)指针*/int m_dvlength;/*向量中项数*/struct access*m_rights;/*访问权表指针*/int m_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)参数m sgstruct给出了一个结构的地址,这个结构包含了接收到的信息的地址与发送方的IP地址。Recvmsg所记录的结构的格式与sendmsg所要求的完全一样。这样,这两个过程在接收信息与发送应答时能很好地配合。,实现套接字API的过程,31,实现套接字API的过程,9辅助过程 服务器在调用accept过程接收连接请求之后,它可以调用getpeername过程来获得启动连接的客户的完整地址。应用程序可以调用setsockopt过程存储套接字选项,getsockopt获得当前选项值。选项主要用来处理特殊情况(例如,通过改变协议软件使用的内部缓冲区大小来提高性能等)。有两个过程可用来在I P地址和计算机名之间进行转换。gethostbyname过程通过计算机名字返回该计算机的IP地址。客户经常使用gethostbyname将用户输入的名字转换成相应的协议软件所需的IP地址。gethostbyaddr提供一个反向的映射给出一台计算机的IP地址,它将返回该计算机的名字。客户与服务器可以在向人显示信息时使用gethostbyaddr。,32,套接字API的应用示例,这个例子包含服务器和客户两个部分,服务器打开一个TCP端口,绑定到本地地址上去,等待客户的连接,客户的连接被服务器接受后,服务器发送信息到客户并关闭这次连接、等待下一个客户的连接。客户接收到信息后,显示在终端上,结束客户程序。,2服务器代码/*server.c-使用TCP的服务器程序实例代码*/#ifndef WIN32#define closesocket close#include#include#include#include.详细,1客户代码/*client.c-使用TCP的客户程序实例代码*/#ifndef WIN32#define closesocket close#include#include.详细,33,B/S编程模式及相关技术,7.3.1 Web基础知识7.3.2 MVC思想和在Web开发中的使用7.3.3 Web编程语言中的通用概念7.3.4 Web编程的例子,34,Web基础知识,1统一资源定位器2Web服务器与浏览器3理解HTTP4 HTML,35,统一资源定位器,URL可以分为以下几部分:Protocol:/(协议)Servername.domain(服务器名.域)directory/(目录)file(文件),36,统一资源定位器,其他常见的URL为:ftp:/服务器域名/目录/文件。ftp:/用户名服务器域名/目录/文件。telnet:/服务器域名。news:/新闻服务器域名/新闻组。,37,用户可以使用URL向服务器传递数据。典型应用为向服务器方函数传递参数。例如:http:/服务器域名/目录/文件/file.html?用户名Jamison&uid=300此URL向file.html主页传递一对参数:用户名Jamison和UID300。有时,需要在URL中包含特殊字符如空隔或斜杠(/)。这些特殊字符必须重新编码以避免服务器出现问题。编码过程(有时指16进制编码)包括将特殊字符用其16进制的数取代。例如:假设用户需要在URL中列出用户全名:http:/服务器域名/目录/file.html?用户名Neal%20Jamison在示例中,Neal和Jaminson间的空隔由与空隔等价的16进制的数取代。,统一资源定位器,38,Web服务器与浏览器,Web服务器是Web的内容提供者。它响应客户端请求,并向客户端提供某种形式的数据。这些数据采用超文本标记语言(HTML)。Web浏览器是Web的客户端。浏览器包括与Web服务器建立通信所需的软件及转换,并显示从服务器方返回数据的软件。常见的Web服务器有:Apache HTTP Server(http:/)Microsoft Internet Information Server(IIS,http:/=7001)常见的Web浏览器有:ie/default.asp)Mozilla Firefox(http:/)Netscape Browser(http:/Web Browser(http:/),39,理解HTTP,HTTP协议使Web服务器和浏览器可以通过Web交换数据。它是一种请求/响应协议,即服务器等待并响应客户方请求。HTTP不维护与客户方的连接,它使用可靠的TCP连接,通常采用TCP 80端口。客户/服务器传输过程可分为四个基本步骤:1)浏览器与服务器建立连接;2)浏览器向服务器请求文档;3)服务器响应浏览器请求;4)断开连接。HTTP是一种无状态协议,它不维护连接的状态信息。,40,理解HTTP,为了使服务器与客户端通信成为可能,HTTP协议建立了一种由请求和响应消息组成的Web语言。客户请求包含以下信息:请求方法请求头请求数据请求方法是用于特定URL或Web页面的程序。,41,理解HTTP,常用的请求方法有:GET请求指定的文档HEAD仅请求文档头POST请求服务器接收指定文档作为可执行的信息头信息是可选项,它用于向服务器提供客户端的其他信息。如:Accept客户端接收的数据类型User-Agent 客户方软件类型Authorization认证消息,包括用户名和口令Referer引用当前请求的Web页面,42,理解HTTP,如果客户采用某种方法获取数据(如POST),数据就放在头(header)之后;否则客户机等待从服务器传来的响应。服务器响应包括以下关键部分:状态码响应头响应数据,43,理解HTTP,HTTP定义了多组返回给浏览器的状态码。状态码是三位十进制数,状态码的最高位表明状态码的类别,常见的有以下类别:2xx成功,如200表示请求成功等3xx重定向,如302暂时转移等4xx客户方错误,如403表示用户权限不够、404表示文件未找到等5xx服务器错误,如500表示服务器内部错误等响应头向客户方提供服务器和/或请求文档的信息。所有的头均以空行结束。常用相应头有:ServerWeb服务器信息Date当前日期/时间LastModified请求文档最近修改时间Expires 请求文档过期时间Content-length 数据长度(字节)Content-type数据MIME类型,44,HTML,超文本标记语言是所有浏览器都可以理解的标准语言。它是一组标明Web页面内容的标记组成。HTML与平台无关,因此,可以高效地从一个计算机环境传输到另一个计算机环境。,45,HTML,HTML使用标记指明信息的表现形式,标记的语法格式如下:信息 类型开始于结束于,并且标记可以嵌套。,46,HTML,HTML Web页面包含三个部分:以表示HTML文件的开始,表示HTML文件的结束;和包围的部分是HTML文件的头部,包含一些控制信息;和包含的是主体部分,是直接显示的正文部分。基本结构如下:Sample PageHello World!学习HTML就是学习标记的用法,常用的有:表示段落表示换行表示超链接表示图片,47,MVC思想和在Web开发中的使用,MVC最初是在Smalltalk-80中被用来构建用户界面的。M代表模型Model,V代表视图 View,C代表控制器Controller。MVC的目的是增加代码的重用率,减少数据表达,数据描述和应用操作的耦合度。,48,MVC思想和在Web开发中的使用,MVC关系图,49,MVC思想和在Web开发中的使用,把这种思想拿到Web开发中来,可以把Web的开发放到三个不同层次上去看:呈现层(Presentation Layer)用户UI,其实就是HTML、Javascript等的用户界面商业逻辑层(Business Logic Layer)处理用户请求,对用户输入的信息按照商业逻辑的要求进行处理,并把处理的结果交由呈现层返回给用户。一般使用ASP、PHP、Perl、Java等语言进行处理数据层(Data Layer)对信息的抽象、描述和存储,一般指存储信息的数据库系统、文件系统等,50,MVC思想和在Web开发中的使用,3层Web应用:,51,Web编程语言中的通用概念,1Request2Response3Application/Context4Session5Server/System,52,Web编程语言中的通用概念,1.Request Request对象/数组包含了一次HTTP请求的所有信息,包括浏览器的请求方法(Method)、请求URL、请求头信息、请求数据等信息,程序设计者可以通过它从呈现层获取用户数据。如在ASP中可以通过Request对象获取通过Web表单(Form)提交过来的信息:Request.form(”userName”)实现同样的功能,在JSP里要这样来写:request.getParameter(”userName”);,53,Web编程语言中的通用概念,2Response 与Request对应,Response则包含了一次HTTP相应的所有信息,如把HTML发送给浏览器、重定向用户请求等。,如在ASP中可以这样把一个信息发送给浏览器:在JSP里Response的输出必须用out来写,所以上面的语法到JSP里为:,Response.write”Hello world!”,out.print(”Hello world!”);,54,Web编程语言中的通用概念,3.Application/Context Application常常指一次Web服务器的启动环境,包含了与这一次启动有关的任何数据,它为所有在这次启动中的客户所共有。如一个很简单的聊天程序用ASP来实现可以这样来写,一个用户使用以下语句把信息写入Application:Application(”chatinfo”)=”Hello everybody!”其他用户可以简单地通过引用Application(“chatinfo”),就可以取到这条信息:Response.write Application(”chatinfo”),55,Web编程语言中的通用概念,4.Session Web编程语言使用Session的概念来说明客户的一次连续访问.同一时刻来自不同客户IP地址的请求也会被看作是不同的多个Session。每个Session,系统都会分配一个SessionID给它来标示自己,在ASP中存取Session变量的方法如下:Session(”userName”)=”张三”Response.write Session(”userName”)每个客户都可以在Session的userName中存储自己的姓名,每次取出时也只能取出自己的。,56,Web编程语言中的通用概念,4.Session Session也有两个类似的事件,分别是Session_OnStart和Session_OnEnd。举一个联合使用Application和Session事件的例子统计网站实时在线人数,正式的代码如下:Sub Application_OnStart()Application(userCount)=0End SubSub Session_OnStart()Application.lockApplication(userCount)=Application(userCount)+1Application.unlockEnd SubSub Session_OnEnd()Application.lockApplication(userCount)=Application(userCount)-1Application.unlockEnd Sub 其中的Application.lock和Application.unlock是为了在多用户写同一数据时,保证他们互斥访 问,避免出现同步问题。,57,Web编程语言中的通用概念,5.Server/System ASP中的System对象或Java中的System对象可以为编程语言提供一些系统服务,如Server.CreateObject(“ADODB.Connection”)可以创建ADO数据库连接对象,在JSP或Servlet的编程中System.currentTimeMillis()可以返回当前时间信息等。,58,Web编程的例子,这里用一个提交用户信息的例子来演示一下Web编程:提交的用户信息包括用户名、密码、姓名、身份证号、居住省份等信息。例子包含两个部分,供用户填写的表单部分(input.htm)和处理用户输入的部分(getInfo.asp或getInfo.jsp)。,59,Web编程的例子,1表单部分(input.htm)浏览器中的显示结果如下图:,60,Web编程的例子,2处理用户输入部分JSP代码,执行结果如图如下图:,61,Web编程的例子,3处理用户输入部分 ASP代码,浏览器中的显示结果类似下图:,