Client/Server框架结构的理解

来源:互联网 发布:淘宝联盟账号怎么填 编辑:程序博客网 时间:2024/05/16 08:46

 

Symbian OS使用服务器集中管理资源.这个估计是一个单独运行的精灵进程,具有单独的地址空间,客户通过他提供的接口来访问他们

这样保证了服务器管理的资源不被破坏.

客户端通过使用客户端类来使用服务器.客户端类用于和指定的服务器建立会话,并发送命令给服务器,同时获取服务器端的响应.

Symbian 使用服务器来完成大部分的功能,这样可以异步的完成许多功能.

Symbian中的系统服务器通常包括以下几种:

1:Kernel Server

     1.1:RTimer 提供异步时间服务

     1.2:RThread 提供线程的访问和创建

     1.3:RSemaphre 提供线程间的同步机制

2:File Server

     2.1:RFs 提供到文件服务器的一个会话,可以完成高层次的驱动器,目录和文件的操作以及获取目录列表

     2.2:RFile 提供文件创建,读取和写入操作

     2.3:RDir 提供目录所在的entries

3:Window Server

     3.1:RWindow提供屏幕显示操作,开发人员一般使用CCoeControl:Draw()

     3.2:RAnim与服务器端 animation通信

     3.3: CWindowGc 提供屏幕显示操作

4:Font&Bitmap Server

     4.1:RFbsSession在字体和位图服务器之间的一个会话,程序开发中不使用这个

     4.2:CFbsBitmap表示一个位图

     4.3:CFbsDevice表示一个用于显示位图的图形设备

5:TelePhonyServer 负责设备的功能

     5.1:RTelSever 提供到服务器的工具级别的访问

     5.2:RPhone 提供设备上的操作

     5.3:RLine 提供一路的操作

     5.4:RCall提供某一路上的拨打接受功能

6:Sockets Server

     6.1:RSocketServ 提供连接到Socket服务器 发现所有的协议

     6.2:RSocket 提供连接到,接受,发送数据到另外一个Socket

     6.3:RHostResolver 提供DNS解析功能

7:Comms Server 允许开发者通过电缆或者红外使用串口

     7.1:RCommServ 提供一个到 Comms Server的会话

     7.2:RComm提供通过串行口通信的功能

8:Message Server 保存消息数据并提供到SMS,MMS,OBEX,Mail等消息功能的访问

     8.1:CMsvSession 描述一个和消息服务器的会话

     8.2:CMsvEntry 描述消息存储中的一个入口

     8.3:CBaseMtm 提供访问和操作消息服务器入口的接口

Symbian OS的服务器总是运行在与客户端分离的线程中的 而且通常运行在与其客户分离的进程中的
。在symbian中。每个进程的内存空间是独立的,所以当服务器运行在不同的进程中的时候 客户和服务器是不能访问对象的虚拟地址空间的。因此所有的Client/Server的服务都是以内核为中介的在单独的线程和进程间通过消息传递和数据传递来完成通讯的
每个服务器都有一个对应的继承于RSessionBase的客户端类。这个客户端类用于启动服务器 并于服务器进行通信  为了使用服务器 ,客户端首先和服务器建立一个会话,客户端通过这个会话发送命令给服务器。在服务器端,一个会话通过一个会话类(继承于CSharableSession)的实例来表示,在处理命令的时候,可以用于保存状态信息等。
 下面是客户端服务器端的基本类介绍:


客户端:基类 RSessionBase类------(这个类是一个拥有其他对象句柄的基类)  一个本类的对象表示一个基本的唯一的客户端服务器端对话,并用来向服务器发送消息
 他的方法有CreateSession------创建一个会话
                     SendReceive() 和Send() 用于发送消息给服务器

服务器端:CServer2 基本的服务器端基类 他派生自CActive是一个抽象基类
 他的方法有NewSessionL() 创建一个新的会话,当客户请求与服务器建立连接的时候调用这个方法
                     StartL()将服务器添加到活动调度中并且发起第一个消息接受请求

RMessage2: 表示一个客户端的请求 表示一个要到达服务器的客户端请求但是这个类我们不会直接使用而是当我们调用RSessionBase::SendReceive()发送请求,连接服务器或者关闭会话的时候 内核都回构造Ressage2对象

CSession2类:表示一个服务器中的一个与客户的对话,对于客户端的每一个RSession派生类对象 服务器端都有相应的CSession2的派生类对象与之相对应,当客户段使用RSessionBase::CreateSession发送的请求被服务器端接受的时候 服务器端就会创建该对象为客户端服务

这样的话Symbian OS 的异步系统可以这样理解:
server就集成两个类,一个CServer2, 一个CSession2。
client端继承自RSessionBase。
client和server通过所谓的session通信利用我们不知道的什么的RMessage2来动作。

然后我们会想他们的session是如何的 咋样把他们联系了起来?
其实呢session就是server知道client身份的一种方式。我们看RSessionBase的基类就会发现它就是一个句柄。一个标识符。就像一个身份证号一样的东西。server通过client的这个标志来为不同的client服务。不然的话,A要的pissa送给了B岂不是麻烦了

 那他们在不同的进程中,怎么访问的呢?

跨进程肯定要有kernel的参与了,比如说我想发一段buffer给server,一般我们会告诉server,我的buffer放在了我的地址空间中的某个地方。server接收到消息,一看buffer在你的地址空间中,我也没权利访问你的地址空间呀,于是它只能求助于kernel帮它把东西去回来。
在kernel对应一个DSession。client发送消息给server,需要kernel的介入。kernel端有一个message slot用来存放所有的没有处理的消息。client端要创建一个连接的时候,kerne在dobjectcon中找对应的server,如果没有启动,就启动server。server紧接着会向kernel订阅消息。kernel接到client段的连接请求的时候,会发送消息到serve的消息队列中。server处理建立session的消息,建立一个session。
同步执行的消息不是放在message slot中的,是放在线程的DThread中的。每一个RThread在kernel端都对应一个DThread。

什么时候需要写一个server,写他的意义是什么了?
1。多个client,如果只有一个人用,写个engine就好了
2。资源共享,多个client都要用到同一个资源。server可以实现对资源的保护
3。安全检查,server可以检查client段是否有这个capability来访问相应的资源 这个就使签名什么的如何来了