Symbian OS中的Client/Server机制分析
2010-09-06 08:10:00 来源:WEB开发网3, Server的启动,server的TInt E32Main()作为程序的入口开始run,在Server的ThreadFunctionL()中,首先会创建一个CActiveScheduler --活动对象调度器,例子里面的Server--CTimeServer从CServer2继承,而CServer2是一个活动对象,所以 CTimeServer也是一个封装后的活动对象。
4,在CTimeServer::ThreadFunctionL() 中调用CTimeServer::NewLC() 来构造Server,在 CTimeServer的ConstructL()中调用基类CServer2的方法StartL() 来启动AO,在这个方法里面,我们猜测会发一个请求,等待Client端的连接,并调用AO的基类CActive的方法SetActive来表明他触发了一个请求。然后,会调用CActiveScheduler::Start()让AS来处理请求。此时的Server已经启动完毕,等待Client发出创建 Session的请求。
5,Client在RTimeServerSession::Connect()里面继续调用RSessionBase重载的方法之一CreateSession()来创建一个Client端的Session来和Server通信。
6,Server 的AS在收到这个请求后,会调用CServer2这个AO的RunL(),在这个函数里面会调用它的一个需要派生类做实现的虚接口 NewSessionL() (此处是猜测CServer2的实现),在这个函数里面Server会用CTimeServerSession::NewL()创建一个表示这个Client连接的Session。此时 Client和Server端连接的通道,两个Session的实例都已创建,Client和Server可以通信了。
Client 的Session是从RSessionBase继承的,由一个handler(其实它是一个AO)拥有;Server端的Sessin是从 CSession2继承的,它有Server创建,然后会放到CServer2的这个数据成员里面:TDblQueIter< CSession2> iSessionIter;而CServer2,则又是一个AO。这里是否可以简单的理解为AO来使用Session??
7,此时Server已经启动,Client也启动了,Client和Server的通信线路也已经建立起来了。在Appui里面点菜单启动时钟,会调用 AsyncDocument()->UpdateTime();在Document里面会调用iHandler->RequestTime (); Handler这个AO,首先会检测自己是否还处于活动状态(通过AO的基类方法IsActive()),如果没有的话,就通过Client端的
更多精彩
赞助商链接