通信网络程序设计章-课件2.ppt

上传人(卖家):ziliao2023 文档编号:6465410 上传时间:2023-07-13 格式:PPT 页数:152 大小:750KB
下载 相关 举报
通信网络程序设计章-课件2.ppt_第1页
第1页 / 共152页
通信网络程序设计章-课件2.ppt_第2页
第2页 / 共152页
通信网络程序设计章-课件2.ppt_第3页
第3页 / 共152页
通信网络程序设计章-课件2.ppt_第4页
第4页 / 共152页
通信网络程序设计章-课件2.ppt_第5页
第5页 / 共152页
点击查看更多>>
资源描述

1、1第2章 程序设计基础2.1 函数函数2.2 句柄句柄2.3 事件与消息事件与消息2.4 进程与线程进程与线程2.5 通信模式通信模式2.6 通信服务通信服务2.7 通信方式通信方式2.8 工具方法工具方法小结小结2在初步建立网络以及网络程序设计的基本认识之后,读者对网络程序设计的大体轮廓也有所了解,本章将进一步介绍开展网络程序设计所要涉及的重要概念及面临的问题。具体将以容易入手的面向过程编程理念为起点,把后续学习需掌握的关键知识剥离出来并总结为八个方面分别进行介绍。本章首先介绍作为程序设计基本工具的函数和句柄;接着讲解Windows操作系统下事件与消息的概念和区别;继而介绍程序的两种量化程序

2、独立性的单位,即进程与线程;然后将对网络通信的模式、服务、方式进行归纳性的介绍;最后重点说明网络程序设计需要使用的工具和方法。3函数是程序设计中除了变量、表达式和控制语句之外最重要的代码部分。变量、表达式和控制语句的通用性很强(编程语言已经决定了其使用规则),但是函数却因为开发领域或开发目的的不同有很大的区别。函数是程序功能的最小单元,是应用程序、类、组件、控件等高层功能的个体单位,网络程序设计学习的核心之一就是学会使用开发工具提供的网络接口函数(有可能是被封装的函数)。下面介绍网络程序设计中经常会用到的几种函数类型。2.1 函函 数数42.1.1 2.1.1 基本函数基本函数许多程序设计语言

3、中,可以将一段逻辑独立的执行代码作为一个单独单元,这就是程序中的函数。如果函数的定义与使用没有什么特殊技术,则称之为基本函数,比如在C语言中:int max(int x,int y)return(xy?x:y);5这是一段比较两数大小的函数。一般情况下,函数通过输入参数或返回值与外部进行交互。C+程序设计中的函数可以分为两类:带参数的函数和不带参数的函数。这两种参数的声明、定义也不一样。带有(一个)参数的函数的声明:类型名标识符+函数名+(类型标识符+参数)/程序代码没有返回值且不带参数的函数的声明:void+函数名()6/程序代码 上面花括号内为函数体。如果没有返回值,类型名为void。有返

4、回值的返回值类型由类型名称标识符决定,如:int类型返回值为int,以此类推。类型名有:void、int、long、float、int*、long*、float*C/C+中的函数必须声明后才可以被调用。调用格式为:函数名(实参)7调用时,函数名后的小括号中的实参必须和声明函数时的函数括号中的形参个数相同。有返回值的函数既可以进行计算,也可以作为右值进行赋值。82.1.2 2.1.2 库函数库函数库函数,顾名思义就是把函数放到库里(通常是编译好的文件)。这些函数首先由一部分人(通常是软件开发商、高级程序员或程序员自己)编写完成放到一个文件里,并编译成二进制文件,供日后调用。通常库函数来自于标准库

5、、用户或第三方提供的库。由于版权原因,库函数的源代码一般是不可见的,但在它的头文件中,可以看到库函数对外的接口。可以以C语言为例来说明库函数的作用。C语言的基本语句十分简单,如果要使用C语言进行sin()或cos()三角函数计算,9就需要编写颇为复杂的程序,这时就可以调用C标准库函数。库函数极大地方便了用户,同时也补充了语言本身的不足。编程时应当尽可能多地使用库函数,这样既可以提高程序的运行效率,又可以提高编程的质量。102.1.3 API2.1.3 API函数函数API(Application Programming Interface)是应用程序编程接口,程序员可以通过API对操作系统和软

6、硬件资源进行调用,它由系统制造商提供(存在于SDK中,见2.8.2节)。为方便用户的开发,大型软件系统几乎都提供自己的API,如google API、Facebook API等。微软为视窗操作系统开发提供的就是Windows API,32位系统下的Windows API称为Win32 API。API不是抽象存在的,而是以一个个具体的API函数的形式存在于SDK中的,用户可以通过开发工具对其进行调用。因此,可以把API想象成一个资源库,它提供各式各样与系统服务有关的函数。11事实上,在Windows下运行的视窗应用(无论是哪种语言开发)最终都是通过(直接或间接)调用Windows API函数来完

7、成其功能的,因此,可以把Win32 API看成是最底层的服务。在Windows程序设计发展初期,Windows程序员所能使用的编程工具唯有Windows API函数。这些函数是Windows提供给应用程序与操作系统的接口,它们犹如“积木块”一样,程序员可以通过它们搭建出各种界面丰富、功能灵活的应用程序。但是,基于Windows API的开发比较复杂,程序员必须熟记一大堆常用的API函数,而且还得对操作系统有深入的了解。12然而随着软件技术的不断发展,在Windows平台上出现了很多优秀的可视化编程环境,程序员可以采用“所见即所得”的编程方式来开发具有精美用户界面和功能强大的应用程序。这些优秀的

8、可视化编程环境操作简单、界面友好(诸如VB、VC+、Delphi等),它们通过提供大量封装了底层API函数的类库和各种控件,并赋予其方便的使用方法,简化了Windows API的复杂操作,因而极大地加速了应用程序开发的过程。有了这些控件和类库,程序员便可以把主要精力放在程序整体功能的设计上,而不必过于关注技术细节。13但是,如果用户要开发更灵活、更实用、更具效率及个性化的应用程序,还是需要调用API函数。虽然类库和控件使应用程序的开发简单得多,但它们只提供Windows的一般功能,对于比较复杂和特殊的功能来说,使用类库和控件是难以实现的。同时,类库和控件对API的封装隐去了很多编程细节,这对初

9、学者非常不利,因此建议如果不是急于完成开发项目,还是从API函数的编程开始学习。API函数的数量非常多,仅Win32 API函数就数千个,程序员不必刻意地背每一个函数的用法,在需要的时候查API帮助或字典工具(参见2.8.2节)即可。14为了区别于用户自己声明的函数,API函数前面用符号“:”标识(该标识也可以省略),如::printf(Hello World!n);/或写成printf(Hello World!n);除了API函数之外,作为网络程序设计的补充Windows Socket2还提供了SPI(详见9.4节),以丰富网络通信。152.1.4 2.1.4 回调函数回调函数回调函数是通过

10、函数指针调用的函数。回调函数把自己的函数指针(地址)作为参数传递给另一个函数,供其调用。可见,回调函数不是由该函数的实现方直接调用的,而是在特定的事件或条件发生时由实现一方的函数调用的,这样就简化了调用过程并增加了调用的灵活性。因而,回调函数常用于对事件或条件进行快速响应。回调函数实现的机制是:(1)定义一个回调函数;(2)提供函数实现方在初始化时将回调函数的函数指针注册给调用者;16(3)当特定的事件或条件发生时,调用者使用函数指针调用回调函数,以对事件进行处理。这种机制对调用者与被调用者实现了分离,调用者不关心谁是被调用者,所有它需知道的只是存在一个具有某种特定原型、某些限制条件(如返回值

11、为int)的被调用函数指针。回调函数的声明如下:LRESULT CALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);CALLBACK是回调函数声明的关键词。17回调函数在网络编程中可用于网络事件通知机制,例如,有时要在网络程序中设置一个监控器,每当特定的事件到达,程序会得到相应的通知,之后会调用一个功能函数。通常情况下,通知机制的实现者对要调用的功能函数一无所知(无法预知用户要进行调用的什么功能),此时就需有一个特定原型的函数指针,用这个指针进行回调,来通知程序事件已经发生并执行设定的事件。这样的实例很多,如后面将要学到的NetBIOS中的NCB/MCB中的ncb

12、_event域(参见4.2.2节)、线程创建CreateThread()函数中的第二个形式参数(参见8.3.1节),都是对回调函数的应用。18回调函数的调用者对被调用者在何处,其传递的处理程序做了什么等都不关心,而只关心返回值,因为基于返回值,它将继续执行或退出。回调函数源自C语言,在C+中只用于与C代码建立接口,或用于与已有的回调接口打交道。针对上述情况,C+主要使用虚拟方法(参见10.1.3节)或函数符(functor),而不是回调函数。192.1.5 2.1.5 挂钩函数挂钩函数Windows操作系统是建立在事件驱动机制之上的,系统各部分之间通过传递消息互相沟通。一般情况下,进程只接受来

13、自它内部的或其他进程发送过来的消息。因此,为了能在应用程序中监控系统的各种事件消息,拦截在进程外传递的消息,Windows提供了挂接各种回调函数的功能,这种技术就被称为挂钩或钩子(HOOK)。挂钩技术是Windows操作系统提供的专门针对系统底层消息进行处理的一种机制,它的出现使得用户可以介入操作系统的内部,对底层进行开发。20它允许应用程序轻松地截获并处理Windows消息或者特定事件,实现普通应用程序难以实现的功能。钩子实际上是一个处理消息的代码段,它通过系统调用挂入系统,从而在合适的位置插入自己的代码扩展或改变原有系统的行为。通过钩子函数,用户可以监视自己的进程或其他进程发生的事件,在捕

14、捉到指定进程请求或返回的特定消息时,钩子函数可以在目标处理函数之前处理它,从而在系统级对所有的消息、事件进行过滤和修改。比如可以通过截获键盘输入的消息来获得键盘输入的信息等,同样还可以通过钩子函数强制结束消息的传递。21函数实现了对数据的操作,是程序的重要元件,学习网络程序设计实际上就是学习网络编程接口函数的过程。上述关于函数的介绍仅是初步的,除此之外的C+的成员函数、虚函数等其他内容,将结合后面的具体应用进行介绍。22在编程过程中,需要对Windows中的一些对象进行引用,一般的引用就是句柄。句柄是整个Windows编程的另一基础,一个句柄是指用于标识应用程序中的不同对象和同类对象中不同实例

15、的唯一整数值(一个32位的无符号整数),这个实例可以是诸如窗口、按钮、图标、滚动条、输出设备、控件或者文件等对象。2.2 句句 柄柄23应用程序能够通过句柄访问相应的对象的信息,Windows使用了大量句柄来标识其内部的很多对象。进一步分析,句柄就是一个标识符,用来标识对象或者项目。它就像我们的车牌号,每一辆注册过的车都会有一个确定的号码,不同的车其号码各不相同,即便是有两辆号码相同的车,它们也肯定在不同的时期出现。应用程序可以通过调用FindWindow()之类的API函数来获得一个它所关心对象的句柄,之后其他的函数就可以使用该句柄来引用该对象。24在Windows编程中会用到大量的句柄,比

16、如HINSTANCE(实例句柄)、HBITMAP(位图句柄)、HDC(设备描述表句柄)、HICON(图标句柄)等。最常用的就是窗口句柄HWND,窗口句柄就是CreateWindow()之类窗口创建函数的返回值hWnd(关于Windows窗口的具体创建过程参见6.6.2节)。下面函数就创建了一个窗口:HWND hWnd=:CreateWindowEx(0,szClassName,NULL,WS_POPUP|WS_SYSMENU|WS_SIZEBOX|WS_VSCROLL,100,100,300,300,0,0,hInstance,NULL);25该窗口成功创建后,后面的程序就可以通过hWnd来引

17、用这个窗口了。进一步分析,句柄实际上是一种指向指针的指针。应用程序启动后,组成这个程序的各对象是驻留在内存中的。由于Windows是一个以虚拟内存为基础的操作系统,在这种系统环境下,Windows内存管理器经常在内存中来回移动对象,以此来满足各种应用程序的内存需要。对象被移动意味着它的地址变化了。如果地址总是如此变化,我们该到哪里去找那个对象呢?为了解决这个问题,Windows操作系统为全体应用程序腾出一些内存单元,用来专门登记各应用程序的对象在内存中的地址的变化,而前者的物理地址在系统运行期间是始终保持不变的。26Windows内存管理器移动了对象在内存中的位置后,会把该对象新的地址及时地告

18、知给对应的句柄并进行更新。因此,只要知道这个句柄,就可以间接地知道对象具体在内存中的哪个位置了,这个地址是在对象装载(Load)时由系统分配给的,当对象卸载时(Unload)又释放给系统。27网络程序是交互功能很强的应用软件,不同用户、进程、线程、函数、对象间进行交互就必须要有相互通知的机制,这就要用到事件与消息。2.3 事事件件与与消消息息282.3.1 2.3.1 事件事件事件(Event)指的是由系统事先设定的、能被对象识别和响应的动作。事件是指对象对于外部动作的响应,当对象发生了某个事件,就会执行这个事件相应的代码,这段代码被称为“事件过程”。事件有系统事件和用户事件之分,系统事件由系

19、统激发,如每隔24小时,银行储户的存款日期增加一天;用户事件由用户激发,如用户点击按钮,在文本框中显示特定的文本。用户可以通过下面函数创建一个事件变量:HANDLE CreateEvent(LPSECURITY_ATTRIBUTES lpEventAttributes,/安全属性29 BOOL bManualReset,/复位方式BOOL bInitialState,/初始状态 LPCTSTR lpName /对象名称);也可以使用OpenEvent()函数打开一个已经存在的事件句柄:HANDLE OpenEvent(DWORD dwDesiredAccess,/请求访问权限BOOL bInh

20、eritHandle,/句柄是否继承LPCTSTR lpName);/事件对象名30在事件变量的使用中应当注意:若指定的事件发生了,则事件变量被置位,处理完成之后,为了等候下一个事件的发生,事件变量需被复位。置位函数:BOOL SetEvent (HANDLE hEvent);/事件对象句柄复位函数:BOOL ResetEvent (HANDLE hEvent);/事件对象句柄31程序员使用等待函数可以监控事件是否被置位,这样的等待函数很多,下面的等待函数可以同时等待多个事件(事件数组)是否被置位。DWORD WaitForMultipleObjects(DWORD nCount,/内核对象的

21、数量CONST HANDLE*lpHandles,/内核对象句柄的数组的指针BOOL fWaitAll,/等待方式标识DWORD dwMilliseconds);/等待超时时间等待过程中,WaitForMultipleObjects()在dwMilliseconds时间段内处于阻塞态。当32WaitForMultipleObjects()因事件触发返回时,返回值是事件数组(由指针lpHandles指向)中导致该函数返回的事件在数组中的索引值。除了WaitForMultipleObjects(),可以用于等待事件置位的API函数还有WaitForMultipleObjectsEx()、WaitF

22、orSingleObject()、WaitForSingleObjectEx()等。332.3.2 2.3.2 消息消息消息是软件对象(这里指具有某种完整功能的个体)之间进行交互作用和通信的手段。通常认为,单一的一个对象是无用的,只有对象间的交互作用,程序才可以获得高阶的功能以及更为复杂的行为。举例来说,一部自行车在无人使用时,就是一堆铝合金和橡胶,没有任何作用;而只有当有其他的对象(人)来和它交互(骑)的时候,它才是有用的。软件对象与其他对象进行这样的交互与通信是利用发送给其他对象消息来实现的。34消息必须包含适量的信息。当对象A想让对象B来执行一个B中的方法(函数)时,对象A就会发消息给对

23、象B,而B需要更多的信息才可能知道该如何正确地完成A的请求。比如,当你想改变自行车的齿轮,就必须指出哪个齿轮,改变的指标是什么。这个信息将作为消息的参数传递过来。消息的地位非常重要,Windows就是利用消息来驱动操作系统工作的,具体介绍参见2.8.1节。352.3.3 2.3.3 事件与消息的区别事件与消息的区别Windows程序开发交互功能的完成主要是基于事件和消息的,二者极易被程序员混淆。消息是Windows操作系统底层支持的,在Windows SDK的开发中,涉及消息循环的处理函数;而事件是基于消息的,是消息到达后触发的。消息发送给操作系统,让操作系统处理消息处理函数;而事件触发时程序

24、立刻调用事件处理函数。二者的区别可以总结为以下三点:(1)含义区别。事件用来描述程序的运行状态或环境的改变,例如鼠标移动、用户按键、窗口状态的改变、时钟计时、线程结束等。36消息实际上是一种通信的机制,操作系统往往会利用消息来通知应用程序某个事件的发生,但这并不意味着消息与事件就是一一对应的或者说是相当的。例如,应用程序完全可以自己直接监视某个事件的发生并对其做出响应,而不依赖于消息;反之,应用程序也可以在没有事件发生的情况下发送消息,如:在完成通信的某个功能或者模拟一次事件时。通俗地讲,事件就是“当的时候”,消息就是“嗨!你该干了”。(2)来源区别。事件只能由用户通过外设的输入产生;而产生消

25、息的来源有三个,即由操作系统产生,由用户触发的事件转换而来,由另一个消息(属于一个应用程序)产生。37(3)激活方式区别。消息是由客户操作产生给服务者,而事件是操作系统处理消息的过程中反馈的结果。事件和消息的区别与联系还需读者在具体的编程过程中逐步体会。了解了句柄、消息、事件、函数,再加上掌握了编程语言提供的变量、控制语句、判断语句,读者编写具有基本功能的Windows应用程序就不存在障碍了。38进程与线程可以理解成量化程序独立性的两个单位,在后续的学习中会被反复提及,二者既有区别又有联系,在进行网络编程时要合理利用。2.4 进进程程与与线线程程392.4.1 2.4.1 进程与线程的定义进程

26、与线程的定义进程是指一个可执行程序的实例,由私有虚拟地址空间、代码、数据和其他操作系统资源(如进程创建的文件、管道、同步对象等)组成。当一个应用程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源。线程是指进程的一条执行路径,是操作系统分时调度分配CPU时间的基本实体。当它被创建后,它就包含了自己独立的堆栈和CPU寄存器状态。所有的线程都是由一个叫做系统调度的程序控制的,该程序会决定执行哪个线程和在什么时候执行。40一个进程所创建的所有线程地址都采用了32位的地址空间(以32位操作系统为例),这就确保了应用程序在执行过程中能够创建足够多的线程来支持应用程序的执行。

27、一个进程的所有线程共享它的虚拟地址空间、全局变量和操作系统资源,其所属线程可以执行进程程序的任意部分代码,即使这部分代码被另一个线程并发地执行。一个进程最少要有一条线程,这条线程称为主线程。为了更好地阐明可执行程序、进程、线程的关系,可以做这样的比喻:可执行程序相当于曹禺先生撰写的小说雷雨(以静态的、纸张的形式存在),41进程相当于不同话剧团(可以是山东剧团、陕西剧团、四川剧团等等)按照小说雷雨编排的不同版本的舞台剧(小说的动态副本),而线程就是舞台剧中一个个不同的角色(他们共用一个舞台)。可以看得出,程序在一个系统中具有唯一性,而进程和线程不具有唯一性,例如,安装在操作系统上某处的Word程

28、序,却可以被同时打开多个副本,里面有可能有多个文档。422.4.2 2.4.2 进程与线程的关系进程与线程的关系一个应用程序在操作系统这个容器里可以同时存在一个或多个进程,一个进程又是由多个线程所组成的,如图2-1所示。图中管理进程和线程的分别是进程控制块(Process Control Block,PCB)和线程控制块(Thread Control Block,TCB)。线程作为进程中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享进程所拥有的,即不同的线程可以执行同一进程内同样的函数。一个进程的众多线程中只有一个主线程。43图2-1 线程与进程的关系图44

29、在网络通信程序设计中,一个进程经常会使用多个线程,其原因可以概括为两点:(1)由于创建新进程必须加载代码,而线程要执行的代码已经被映射到进程的地址空间,所以创建、执行线程的速度比进程更快。(2)一个进程的所有线程共享进程的地址空间和全局变量,所以简化了线程之间的通信。还需注意,虽然在进程中使用多线程技术将大大提高进程的执行效率,但是线程本身具有可能影响进程性能的不利方面。根据操作系统的相关知识,图2-1中的TCB包含的内容有:45进程标识符、处理机信息(含通用寄存器、指令计数器、PSW、用户栈指针)、进程调度信息(含进程状态、继承优先级、调度所需其他的信息)、进程控制信息(含程序的数据地址、资

30、源清单、进程同步和通信机制)。TCB与PCB结构基本相似。当进程/线程在CPU上进行切换时,实际上就是在操作系统内核的任务管理器控制下,把CPU寄存器上的数据压栈到TCB/PCB格式的存储器里,再把即将获得CPU使用权的进程/线程的TCB/PCB入栈到寄存器的过程,这需要耗费许多宝贵的CPU时钟周期,可见进程/线程的切换是有相当代价的。综上所述,线程使用的不利因素有以下几点:46(1)线程也是程序,因而需要占用内存,线程越多,占用内存也越多;(2)多线程需要协调和管理,所以需要CPU时间跟踪线程;(3)线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题;(4)线程太多会导致控制太复

31、杂,最终可能造成进程的不稳定;(5)多线程应用中,使用的系统调用或函数必须是可重入的。47当然,我们不能因为线程所固有的缺点而撇弃线程的使用,这无异于因噎废食。实际上只要通过合理的设计和调度,就可以很好地解决上述问题。可以肯定地说,多线程技术是目前程序设计中的绝对主流。48日常生活中,人们所使用的网络通信模式主要有C/S和B/S两种,它们都是通信系统结构上的抽象。2.5.1 C/S2.5.1 C/S模式模式在TCP/IP网络应用中,通信的两个进程间数据交互的主要模式是客户机/服务器模式(Client/Server Model),即客户向服务器发出服务请求,服务器接收到请求后,提供相应的服务。客

32、户机/服务器模式的建立基于以下两点:2.5 通通 信信 模模 式式49首先,建立网络的起因是网络中软硬件资源、运算能力和信息不均等,需要共享,从而造就拥有众多资源的主机提供服务,资源较少的客户请求服务这一非对等作用;其次,网间进程通信完全是异步的,相互通信的进程间既不存在父子关系,也不共享内存缓冲区,因此需要一种机制为希望通信的进程间建立联系,为二者的数据交互提供同步。客户机/服务器模式在操作过程中采取主动请求方式:(1)服务器方启动,并根据请求提供相应的服务:打开一个通信通道并告知本地主机,它愿意在某公认地址(如FTP:21)上接收客户请求。等待客户请求到达该端口。50 接收到重复服务请求,

33、处理该请求并发送应答信号。接收到并发服务请求,要激活一新进程(或线程)来处理这个客户机请求(如UNIX系统中用fork、exec)。新进程处理此客户请求,并不需要对其他请求作出应答。服务完成后,关闭此新进程与客户机的通信链路,并终止。返回第二步,等待另一客户请求。关闭服务器。51(2)客户机:打开一通信通道,并连接到服务器所在地主机特定端口。向服务器发送服务请求报文,等待并接收应答,继续提出请求 请求结束后,关闭通信通道并终止。从上面描述的过程可知:客户机与服务器进程的作用是非对称的,因此编码不同;服务进程一般是先于客户请求而启动的,只要系统运行,该服务进程一直存在,直到正常终止或强迫终止。5

34、22.5.2 B/S2.5.2 B/S模式模式B/S模式即浏览器和服务器模式,它是随着Internet技术的兴起,对C/S模式的一种变化或者改进。在这种结构下,用户工作界面通过WWW浏览器来实现,极少部分事务逻辑在前端(Browser)实现,但是主要事务逻辑在服务器端(Server)实现,形成所谓的三层(3-tier)结构。这样,就大大简化了客户端电脑载荷,减轻了系统维护与升级的成本和工作量,降低了用户的总体成本(TCO)。53B/S模式的优点如下:(1)可以在任何地方进行操作而不用安装任何专门的软件,只要有一台能上网的电脑就能使用,客户端零维护。(2)系统的扩展非常容易,只要能上网,再由系统

35、管理员分配一个用户名和密码,就可以使用了。(3)可以在线申请,通过公司内部的安全认证(如CA证书)后,不需要人的参与,系统可以自动给用户分配一个账号。B/S模式也存在图形的表现能力及运行速度弱于C/S模式的缺点。542.5.3 2.5.3 两种模式的比较两种模式的比较C/S、B/S模式是出于不同的思想被抽象出来的,它们各有优缺点。C/S是建立在局域网的基础上的客户端需要,而安装专用的客户端软件,能充分发挥客户端PC的处理能力,很多工作可以在客户端处理后再提交给服务器,其优点是客户端响应速度快。C/S的缺点主要表现在以下几方面:(1)扩展性欠佳。随着互联网的飞速发展,移动办公和分布式办公越来越普

36、及,这就需要系统具有可扩展性。55(2)维护性差。客户端需要安装专用的客户端软件。首先,要涉及到安装的工作量;其次,任何一台电脑出问题,如病毒、硬件损坏,都需要进行安装或维护;再次,系统软件升级时,每一台客户机需要重新安装,其维护和升级成本非常高。(3)跨平台性差。一般对客户端的操作系统也会有限制,可能适应于Windows 2000或Windows XP,但不能用于Linux、UNIX,更不用说其他非主流的系统。56与C/S相比,B/S是建立在广域网的基础上的,其优点如下:(1)硬件环境要求宽松。B/S的建立不必是专门的网络硬件环境,例如电话上网、租用设备、信息管理,因而比C/S适应范围更强,

37、一般只要有操作系统和浏览器就行,甚至手持设备都可以胜任。(2)良好的重用性。B/S由构件组成,并要求构件相对独立的功能,能够相对较好地重用,容易实现系统的无缝升级,系统维护开销较小。57(3)交互性强。B/S建立在广域网上,面向不同的用户群,分散地域,这是C/S交互性所无法做到的;同时,B/S建立在浏览器上,有更加丰富和生动的表现方式与用户交流,且开发成本大大减低,对程序员要求相对较低。然而,C/S的显著缺点是:出于安全性考虑,B/S客户端被包裹在浏览器中,无法对本地应用进行调用,大大限制了其功能作用范围;此外,B/S对数据的处理能力也没有C/S强,不适合网络数据处理相关工作。58总体上,C/

38、S和B/S各有优缺点,从长远看,它们通过不断改进可以实现功能互补而长期存在下去。一方面随着网页语言以及浏览器的进步,B/S在表现能力上的处理以及运行的速度上会越来越快,其缺点将会越来越少,新型的B/S描述语言在图形的渲染方面以及音频、文件的处理上也已经非常强大了;另一方面,一种改良自C/S的新通信模式P2P(参见第10章)已快速崛起,它克服了传统C/S模式的许多缺点,并提供了许多新特性,发展潜力非常巨大。59从通信的角度看,网络协议栈中的各层所提供的服务可以分为两大类:面向连接(Connection-Oriented)服务与无连接(Connectionless)服务。2.6 通通 信信 服服

39、务务602.6.1 2.6.1 面向连接服务面向连接服务所谓连接,就是两个对等实体为数据通信而进行的一种结合。面向连接服务要求在数据交换之前先建立连接;当数据交换结束后终止该连接。面向连接服务是电话系统服务模式的抽象,每一次完整的数据传输都要经过建立连接、使用连接、终止连接的过程。本质上,连接是一个管道,收发数据不但顺序一致。面向连接就是1.2.2节通信网交换技术中的虚电路的实现,主要是靠收发控制数据包实现的。61一般来说,面向连接服务过程分为三个阶段:连接建立、数据传输和连接释放。在传送数据时,面向连接服务是按序传送的,这点和电路交换的许多特性很相似,因此面向连接服务又称为“虚电路服务”。面

40、向连接服务比较适合于在一段时间间隔内向同一目的地可靠发送许多报文的情况。对于发送很短的零星报文,则因连接建立、维护和释放的开销过大,而不建议采用面向连接服务。在TCP/IP协议栈中,TCP协议提供面向连接的服务。622.6.2 2.6.2 无连接服务无连接服务无连接服务指两个实体之间的通信不需要先建立好一条连接,其所需的下层资源在数据传输时动态地进行分配。无连接服务是邮政系统服务的抽象,每个分组都携带完整的目的地址,各分组在系统中独立传送。无连接服务不保证分组的先后顺序,不进行分组出错的恢复和重传,不保证传输的可靠性。在TCP/IP协议栈中,UDP协议提供无连接的数据报服务。对于UDP协议而言

41、,因为UDP没有发送缓存,即使在阻塞方式下也不会发生阻塞。无连接服务的另一个特征就是它不要求通信的两个实体同时是活跃的。63只有发送端的实体正在进行发送时,它才必须是活跃的;而接收端的实体只有在进行接收操作时才必须是活跃的。无连接服务的优点是灵活方便和效率高;但它不能防止报文的丢失、重复或失序,该问题必须由应用程序根据需要自行解决。无连接服务特别适合于传送少量、零星的报文。642.6.3 2.6.3 两种服务的比较两种服务的比较表2-1列出了面向连接服务与无连接服务的主要区别。这些区别为网络应用编程选择何种类型的服务提供了依据。65表2-1 面向连接服务与无连接服务区别66两种服务各有优缺点,

42、具体选择何种服务需要根据应用的特点来确定。另外,在无连接服务的基础上增加一些差错处理、拥塞控制等措施后,也能完成面向连接的服务的功能。67网络通信过程复杂,前提条件众多,不是任何通信步骤、动作都可以一次成功的。就持续等待还是暂时放弃这个问题,形成了两种鲜明的通信(操作)方式,即通信的阻塞和非阻塞方式(有些地方也称为等待和非等待)。这两种方式的选择在网络编程时也是一件非常重要的事情,对于不同的协议,阻塞通信和非阻塞通信有不同的表现。2.7 通通 信信 方方 式式68在阻塞方式下发送一个报文时,如果低层协议没有可用空间来存放用户数据,则应用进程将阻塞等待,直到协议有可用的空间;而在非阻塞模式下,调

43、用将直接返回而不需等待。在应用进程调用接收函数接收报文时,如果是在阻塞模式下,若没有到达的数据,则调用将一直阻塞,直到有数据到达或出错;而在非阻塞模式下,将直接返回而不需等待。通信方式对应用程序的设计方法也有直接的影响。在非阻塞方式下,应用程序必须不断地轮询是否有数据到达或有连接请求到达。这种轮询的方式耗费CPU资源较大,要尽可能避免使用,或采用多路复用来解决这一问题。69在阻塞方式下则不存在这一问题,但缺点是进程或线程在执行I/O操作时将被阻塞而不能执行其他的工作,因此在单进程或单线程应用中不能使用这种模式,而在多线程应用中比较适合采用阻塞模式,一个线程被阻塞不影响其他线程的工作。对于面向连

44、接的协议,在连接建立阶段,阻塞与非阻塞也表现不一。在阻塞方式下,如果没有连接请求到达,则等待连接调用将阻塞,直到有连接请求到达;但在非阻塞方式下,如果没有连接请求到达,等待连接调用将直接返回。在连接建立阶段,不管是阻塞方式还是非阻塞方式,70发起连接请求的一方总会使调用它的进程阻塞一段时间,阻塞间隔最少等于到达服务器的一次往返时间。另外,通信方式的选择与操作系统的类型也有关系。例如,在非抢占式操作系统中,应用程序应尽量不要使用阻塞方式。71本节将介绍网络程序开发的工具、考虑的问题及工作流程。2.8.1 2.8.1 系统平台选择系统平台选择当前,绝大多数的网络通信是建立在计算机操作系统(Oper

45、ating System)基础上的,操作系统为用户与硬件的交互提供了媒介,是网络编程的基础。操作系统因开发理念和应用目的的不同而具有较大的差别,进行通信程序设计之前必须对所依托的操作系统的性能特点进行很好地掌握。2.8 工工 具具 方方 法法721 1操作系统及分类操作系统及分类网络程序设计依托于计算机软硬件平台,用户的指令必须通过操作系统发出,硬件的信息与响应又是透过操作系统反馈给用户的。操作系统是网络编程的基本平台,网络编程的工具、语言、方法技巧又因操作系统而异。像计算机系统根据不同应用领域分为多种类型一样,操作系统也分多种类型。但不管是哪一种操作系统,其基本目标只有一个,即要实现在不同环

46、境下为不同应用目的提供不同形式和不同效率的资源管理,以满足不同用户的操作需要。731)按适用面分类计算机操作系统按适用面可分成如下几点:(1)专用操作系统,指为特定应用目的或特定机器环境而配备的操作系统,包括一些具有操作系统特点的监控程序。例如,用于数控机床的工控机操作系统。(2)通用操作系统,指为通用计算机配备的,能为各种计算机用户提供服务的系统。通常提到的操作系统均是指通用操作系统,如UNIX、Windows、Linux等。74(3)嵌入式操作系统,指运行在嵌入式系统环境中,对各种部件装置等资源进行统一调度、指挥和控制的操作系统。嵌入式操作系统除了具有通用操作系统的基本特性和功能外,还具有

47、管理所嵌入设备和环境资源的功能,如WEPOS、Vxworks、嵌入式Linux等。752)按任务处理方式分类计算机操作系统按任务处理方式可分成以下几类:(1)交互式操作系统,指能为用户提供交互操作支持的操作系统。操作系统都兼有交互式操作系统的功能,如UNIX、Windows、Linux等。(2)批处理式操作系统,指以成批处理用户程序为特征的操作系统。它是相对交互式操作系统而言的。在批处理方式下,用户只能在一个批次处理完毕后,方能调试程序中可能存在的问题或获得计算的结果。批处理方式着眼于提高计算机系统效率,而交互式则着眼于方便用户使用。763)按处理器使用特点分类计算机操作系统按处理器使用特点可

48、分成以下几类:(1)分时操作系统,采用分片技术(将一个CPU的运行时间划分为多个细小的时间片、按时间片轮流方式分配给多个程序)使一个处理机为多个用户或多个程序提供服务。(2)实时操作系统,指能够在期望的较短时间内即时响应用户要求并完成用户所需操作的操作系统。实时操作系统除具有分布式操作系统的多路性、交互性、独占性和及时性之外,还要具有可靠性要求。在实时系统中,一般都要采取多级容错技术和措施(关键部件采用冗余设计作为后备)来保证系统的安全性和可靠性。774)按用户数量分类计算机操作系统按用户数量可分成如下几类:(1)单用户操作系统,只能服务于单个用户的操作系统,如MS-DOS。(2)多用户操作系

49、统,能同时为多个用户服务的操作系统,如Windows。785)按硬件支撑环境和控制方式分类计算机操作系统按硬件支撑环境和控制方式可分成如下几类:(1)集中式操作系统,指驻留在一台计算机上或管理一台计算机的操作系统。(2)分布式操作系统,指通过网络将大量计算机连接在一起,以获取极高的运算能力、广泛的数据共享以及实现分散资源管理等功能为目的的操作系统。本书主要是基于Windows这种通用、交互式、实时、多用户、集中式操作系统展开网络编程设计的,因此在后续的编程过程中要特别注意这种操作系统的上述特点并展开开发。792 2WindowsWindows平台平台Windows是美国微软公司推出的视窗系列操

50、作系统,是承载本书网络应用程序的平台。目前主流的Windows产品包括:(1)Windows 95、Windows 98、Windows Me、Windows NT、Windows 2000、Windows 2003;(2)Windows XP Professional、Windows XP Home;(3)Windows XP Media Center Edition;(4)Windows XP Tablet PC Edition;(5)Windows CE;(6)Windows Vista、Windows 7等。80它们大都是32位的操作系统,即CPU能同时处理的数据的位数为32位,通过窗

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(通信网络程序设计章-课件2.ppt)为本站会员(ziliao2023)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|