【精品】客户端-服务器框架.ppt
《【精品】客户端-服务器框架.ppt》由会员分享,可在线阅读,更多相关《【精品】客户端-服务器框架.ppt(105页珍藏版)》请在三一办公上搜索。
1、客户端-服务器框架,第一部分,2,客户端-服务器框架,本讲讲解Symbian OS中的客户端-服务器框架模型描述客户端-服务器模式背后的理论为什么在Symbian OS 中使用它以及它是如何工作的?设计的实现类使用客户端-服务器模型的运行时性能,3,客户端-服务器模式,知道Symbian OS中客户端-服务器框架的结构和好处理解系统和暂时服务器的不同角色,为服务器应用程序的例子匹配适当的服务器类型,4,客户端-服务器模式,在客户端-服务器模式中客户端使用服务器提供的服务服务器接收来自客户端的请求消息并处理它们以同步或者异步的方式服务器典型的被用于管理对系统资源和服务的共享访问使用服务器是高效的
2、,因为它可以为通过客户端会话提供服务以及被相互独立的线程中的客户端并发访问注意客户端-服务器框架也能被用于包括含有可写静态数据的代码,5,客户端-服务器概念示意图,资源,服务器,服务器,客户端,客户端API,调用客户端#2,调用客户端#1,调用客户端#3,6,客户端-服务器模式,服务器保护系统的完整性它能保证资源在客户端之间正确的共享因此所有的客户端能正确使用资源在Symbian OS中服务器运行在自己的进程中具有独立隔离的地址空间客户端对服务的访问是通过定义良好的接口进行的通过在独立的进程中使用服务器操作系统能够保证不好的编程或者恶意客户端不能破坏服务器管理的资源,7,客户端-服务器模式,服
3、务器必须防止非法和失序的客户端请求它应该终结冒犯者典型的,会对客户端引发一个致命错误Symbian OS上绝大多数的系统服务是用客户端-服务器框架实现的特别的它们提供了异步的功能例如窗口服务器(用于访问UI资源,例如屏幕和键盘)串行通信服务器(用于访问串口)文件系统服务器,8,客户端-服务器模式,有多种方法用以启动和停止服务器:系统服务器(例如文件服务器)对于操作系统运行是必需的它们作为Symbian OS的一个部分被启动它们在OS运行期间都一直运行如果它们需要意外终止通常会强制手机重启,9,客户端-服务器模式,应用程序服务器只有当特定应用程序运行时才需要运行当客户端需要连接它们时启动只有服务
4、器的单个实例运行(有第一个需要服务器的客户端启动)当最后的客户端会话关闭时服务器应该终止以节约系统资源这类服务器被称为暂时服务器,10,客户端-服务器模式,其他服务器要求每个应用程序一个实例例如POSIX 服务器有该应用程序启动并在它终止时关闭服务器多个应用程序可以使用相同的服务器实现每个应用程序拥有其私有的实例,11,Symbian OS客户端-服务器框架基础,知道Symbian OS客户端-服务器实现的基础,12,客户端-服务器框架基础,一个Symbian OS 服务器总是 运行在独立于客户端的线程中通常 但不是总是 运行在一个独立的进程中每个进程的内存是隔离的所以客户端和服务器不能访问彼
5、此的地址空间因为这个原因所有的客户端-服务器通信通过消息传送发生的分离的线程/进程之间数据的传输由内核中转分别被称为线程间传输(ITC)或进程间传输(IPC),13,进程 vs 线程,进程,进程 A,共享相同进程空间的客户端和服务器通过ITC通信,在分离线程中的客户端和服务器通过IPC通信,内核中转的消息,内核中转的消息,14,客户端-服务器框架基础,客户端和服务器之间用以传送消息的通信通道被称为会话(session)会话由客户端初始化服务器端的代表已经有内核创建内核也可用作所有客户端-服务器通信的中间人,15,客户端-服务器框架基础,客户端向服务器发送一个请求通过一个标识了请求性质的消息对象
6、还包含了其他额外参数对于简单的事务这就足够了但是对于复杂数据需要用线程间数据转移函数传递参数数据和返回值,16,客户端-服务器框架基础,一个典型的服务器具有客户端代码,用于将传递给服务器的请求进行格式化请求通过内核发送例如Symbian OS文件服务器的客户端(efile.exe)是一个真正的文件服务器客户方实现的客户端链接提供它的DLL(efsrv.dll)客户端方实现DLL对使用它的代码隐藏了私有的客户端-服务器通信协议,17,具体的文件服务器例子,efile.exe,进程边界,efsrv.dll,mytest.exe,链接到efsrv.lib 并调用其API方法,如RFs:Connect
7、(),客户端方的服务器实现Implementation,文件服务器,客户端-服务器通信(内核中转的消息),18,客户端-服务器框架基础,服务器常被用于为其客户端提供异步服务因为它们运行在独立与客户端的线程中一个客户端可以提交向一个服务器提交多个请求(最多可以255个)但是只能有一个激活的同步请求,19,Symbian OS 客户端-服务器类,知道被Symbian OS客户端-服务器框架使用的类,以及每个类的角色的基本信息:RSessionBaseTIpcArgsTSecurityPolicyRMessage2CSession2CServer2CPolicyServer认识服务器在启动时必须初始
8、化的对象理解用于防止Symbian OS中的服务器欺骗的机制,20,Symbian OS 客户端-服务器类,本节介绍被用来实现Symbian OS客户端-服务器框架的类这里讨论的类是Symbian OS v8.1b及其以后版本引入的用于安全进程见通信的类,21,Symbian OS客户端-服务器类,客户端方表示从RSessionBase 派生-主要的客户端一侧类是所有拥有其他对象句柄的类的基类那些对象通常是在内核中创建的一个RSessionBase 对象唯一的标识一个客户端-服务器会话被用于给服务发送消息,22,Symbian OS客户端-服务器类,RSessionBase 的大多数方法是受保
9、护的,以确保用于访问服务器的客户端一侧的类不会直接暴露对服务器的访问接口相反,从RSessionBase 派生的类导出的函数会调用受保护的RSessionBase 方法这样“包装”了与服务器的通信,23,客户端-服务器类,24,Symbian OS 客户端-服务器类,例如类RFs 从RSessionBase 派生提供了对文件服务器的访问通过诸如RFs:Delete()和 RFs:GetDir()的方法允许与文件服务器通信,而不必暴露对它的直接访问,25,Symbian OS 客户端-服务器类,类RSessionBase 具有几个CreateSession()的重载函数用以开始新的客户端-服务器
10、会话典型的,由客户端一侧实现的代码在其导出函数中调用例如Open()或 Connect(),它们并用于初始化会话,26,Symbian OS 客户端-服务器类,例如开始一个与文件服务器的会话需要调用RFs:Connect()它调用了RSessionBase:CreateSession()当成功打开时,相应的内核和服务器一侧对象也被创建,27,Symbian OS 客户端-服务器类,一个服务器具有唯一的名称它必须被传递给RSessionBase:CreateSession()以将客户端连接到正确的服务器客户端一侧的实现完成这些工作所以调用代码不需要知道服务器的名字,28,Symbian OS 客
11、户端-服务器类,为了阻止“欺骗”服务器使用关键系统服务器的名字命名空间被分为“普通”和“保护”两个部分保护服务器命名空间被定义为所有以“!”字符开头的服务器名称只有拥有ProtServ 能力的进程能被允许注册以该字母开头的服务器对象ProtServ 能力允许服务器进程用一个被保护的名字注册我们在后面的讲义会再讨论这个问题,29,类 RSessionBase,多个RSessionBase:CreateSession()的重载函数接收一个整型参数aAsyncMessageSlots 该值指明了要保留的槽位个数槽位是为用于保存 已激活的异步请求那是客户端会话可以拥有的向服务器的请求数目可以为每个服务
12、器保留的最大槽位数目是255,30,RSessionBase类,其他CreateSession()的重载函数不预先非配消息槽位的最大数目槽位从内核为该服务器管理的全局消息槽位池中获得,槽位池共有255个槽位在这个系统中每个服务器只有255个槽位可用,31,类RSessionBase,如果已激活请求的数目超过了系统池的槽位数目或者超过了为特定线程保留的槽位数目提交异步请求将失败并且立即返回,其错误码为KErrServerBusy,32,类 RSessionBase,CreateSession()重载函数的其他参数还包括TSecurityPolicy 对象它允许客户端代码向服务器指定标准例如服务器
13、进程的安全ID(secure ID)或者调用进程的能力TSecurityPolicy 类将在后面更加详细的讨论安全IDs,能力以及平台安全也将在后续讲义中讨论,33,类 RSessionBase,给服务器发送请求通过调用RSessionBase:SendReceive()或者 RSessionBase:Send()RSessionBase:SendReceive()方法被重载以处理异步和同步请求异步请求方法接收一个TRequestStatus&参数同步请求则范围一个TInt类型的结果值RSessionBase:Send()方法发送消息给服务器,但是并不接收答复实践中,这个函数很少用到,34,T
14、he Send()和 SendReceive()方法,Send()和SendReceive()方法接收一个32位的参数用以标识客户端请求这典型的定义为客户端和服务器共享的枚举类型请求标识不需要是公开的传递给TIpcArgs 对象的参数数据的顺序也不是,35,The Send()和 SendReceive()方法,请求标识和参数数据是客户端一侧和服务器一侧实现的私有协议该协议对每个客户端-服务器实现都是特定的被包装在客户端一侧实现所导出的公开方法中调用代码不需要“理解”协议,36,从服务器断开,典型的,用于访问服务器的类都有终结方法通常是调用Close()因为该类通常是R类,而该方法是清除R类对
15、象清楚的一般方法从内部看,该方法会调用 RHandleBase:Close()它发送一个断开消息给服务器并设置会话句柄为零服务器一接收到该消息,就结束会话通过销毁代表会话的服务器一侧的所有关联对象如果客户端有任何已激活的请求它们不被保证能够完成,37,从服务器断开,如果客户端激活请求后面跟着Close()调用,则Symbian OS认为其是一个客户端一侧的编程错误因此,引发一个致命错误在会话关闭后,服务器可能努力完成会话已激活的请求并这并不总是这样!所以客户端.应该保证在调用 Close()之前取消所有请求,38,从服务器断开,如果没有调用RSessionBase:Close()就终止了内核负
16、责进行服务器一侧进行必要的清除工作如果服务器线程意外终止了所有等待的客户端请求将以错误码KErrServerTerminated完成这让客户端有机会对所有会话句柄进行清除一旦客户端或者服务器终止(即时后面又重新启动)终止前的会话都不能被再用,39,会话共享,可能会有多个用户客户端共享同一个RSessionBase 对象一个打开的客户端会话可以被共享同一个客户端进程的所有线程之间以及与其他进程的线程之间假定服务器支持会话共享的话一些服务器对连接到服务器上的线程限制会话共享如果尝试共享会话,会引发致命错误这是在Symbian OS v6.0引入可共享会话以前总是发生的事情,40,会话共享,CSes
17、sion2,CServer2,RSessionBase,客服端 1,服务器,客服端 2,线程#1,线程#2(可以与线程#1是同一个进程或者在不同的进程中),RSessionBase:CreateSession()对相同的进程共享RSessionBase:ShareAuto()对不同的进程共享RSessionBase:ShareProtected(),41,会话共享,在客户端一侧如果一个会话能被共享.第一个连接到服务器的会话应当像通常那样用RSessionBase:CreateSession()创建一旦会话打开应该调用它的RSessionBase:ShareAuto()以使其对同一进程中其他线程
18、是可共享的,42,会话共享,如果会话句柄能够被不同进程的线程使用则必须对其调用RSessionBase:ShareProtected()一个替代方法可共享会话通过调用RSessionBase:CreateSession()的重载函数创建该重载函数使用一个TIpcSessionType 参数EIpcSession_Sharable 用于进程内可共享(相同进程)EIpcSession_GlobalSharable 用于全局可共享会话(不同进程),43,类 TIpcArgs,类TIpcArgs 用来包裹要发送给服务器的参数例如一个TIpcArgs 对象构成了客户端-服务器请求的有效载荷它能够将最多四
19、个参数包装在一起并且包含了每个参数的类型信息该对象也可以不包含任何参数用于没有关联载荷数据的请求,TInt SendReceive(TInt aFunction,const TIpcArgs,44,类 TIpcArgs,类TIpcArgs有一个缺省构造函数和四个模板化构造函数允许这类的对象用零到四个参数构造从内部看参数保存在一个简单的包含四个32位值的数组中构造函数中的参数依次的放到数组的槽位中该类也有 一组重载的 Set()函数用于显式的将参数值设置到数组的特定槽位,45,方法 Set()指明要使用的槽位和要保存的32位值它可以是TIntRHandleBaseTAny*TDes16*TDes
20、8*TIpcArgs 类的更多内容会很快在后面介绍,类 TIpcArgs,46,类 TSecurityPolicy,类TSecurityPolicy代表了一种一般性的安全策略由客户端一侧实现代码传递给服务器拥有它的客户端将一个或多个这种对象到服务器指定客户端进程应该进行那些安全检查它指明了客户端API用户对服务器 的访问权限在用于它访问服务器之前,47,类 TSecurityPolicy,TSecurityPolicy 指定的安全策略包括:检查能力在0到7之间检查给定的安全标识(Security Identifier)其能力0-3之间检查给定的商家标识(Vendor Identifier)其能
21、力0-3之间如果指定了多个能力它们全部要通过安全检查,48,类 RMessage2,类 RMessage2代表了服务器一层的客户端请求名字中的 2 指明这是该类的第二个版本最初的类RMessage用于Symbian OS v8.1b及其以前的版本但是后来已经本替换因为引入了安全进程间通信,49,RMessage2 与 TIpcArgs的关系,50,类 RMessage2,类RMessage2 从RMessagePtr2 派生RMessagePtr2 提供了一个由客户端发送的消息的句柄RMessage2 通过封装关联到消息的数据对它进行了扩展每个发送给服务器的客户端请求被表示成一个独立的RMes
22、sage2 对象客户端不直接使用 RMessage2,51,类 RMessage2,RMessage2 对象是TIpcArgs 和请求标识符在服务器一侧的等价对象在客户端发出请求时由内核创建例如通过调用RSessionBase:SendReceive()连接服务器或者关闭会话,52,类 RMessage2,32位的请求标识符也被称为操作码可以通过Function()提取TIpcArgs 提供的四个参数槽位可以通过调用Int0()访问以返回请求数组的第一个32位元素值Int1()返回第二个元素直到通过Int3()返回第四个函数,53,类 RMessage2,以相似的方法Ptr0()以TAny*指
23、针的形式返回请求数组的第一个元素的内容 Ptr1()返回第二个与元素的内容以此类推,由Ptr3()返回第三个元素的内容这样,请求数据参数的结构对每个客户端请求都是预先确定的它可以从RMessage2 对象适当的槽位中提取数据,54,类 RMessage2,指针从Ptr0(),Ptr1(),Ptr2()和 Ptr3()返回的不能由服务器代码直接使用,如果它们指向运行在不同进程的客户端的地址空间的话作为替代,服务器必须使用RMessagePtr2中的ReadL()和WriteL()重载方法它们使用由内核中转的进程间通信来传输数据,55,类 RMessage2,当服务器已经服务了一个客户端请求它会调
24、用RMessage2的RMessagePtr2:Complete()方法该方法通知客户端请求已经完成该方法包装了对客户端线程句柄函数RThread:RequestComplete()的调用传递给RequestComplete()的整型参数被写入到客户端的TRequestStatus 值客户端线程的请求信号量将被通知,56,类 CSession2,类CSession2 是一个抽象基类它代表了服务器中的一个客户端会话对于客户端一侧每个从RSessionBase派生的对象在服务器一侧有一个关联CSession2派生的对象被作为客户端连接请求的一部分创建,通过函数RSessionBase:Create
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 精品 客户端 服务器 框架
链接地址:https://www.31ppt.com/p-2618994.html