很多人觉得client/server机制很复杂。其实不然。
server就集成两个类,一个CServer2, 一个CSession2。
client端继承自RSessionBase。
client和server通过所谓的session通信。
一般大家会有两个疑问:
1. session是什么,很神秘
2. 他们之间怎么通信的。
answer:
1. 其实呢session呢就是server知道client身份的一种方式。
我们仔细看RSessionBase的基类就会发现其实它就是一个句柄。一个标识符。就像一个身份证号一样的东西。
server通过client的这个标志来为不同的client服务。不然的话,A要的pissa送给了B岂不是麻烦了。
2. 他们在不同的进程中,怎么访问的呢?跨进程肯定要有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。
我讲active object机制的时候说过DThread里面还有Request Semaphore 什么时候需要写一个server
1。多个client,如果只有一个人用,写个engine就好了
2。资源共享,多个client都要用到同一个资源。server可以实现对资源的保护
3。安全检查,server可以检查client段是否有这个capability来访问相应的资源
1. RSessionBase::SendReceive会调用Exec::SessionSendSync进入kernel模式
2. kernel中DSession对异步请求处理类似 GetAsyncMessage(); DSession::Send(aStatus);
3. kernel中DSession对同步请求处理类似 Get sync message from DThread DSession::Send(aStatus);
4. 调用DServer的成员,让server来处理,一般会把这个消息放到DServer的一个delivered queue里面。
5. 我们可以看出,这里面DSession相当于server的client,采用的都是异步方式。
所以无论是异步请求还是同步请求到DSession中都变为异步请求。区别在于异步请求的时候是从message slot里面取一个消息,而同步请求是从DThread中取消息发送给DServer。