ClientServer 构架:
一、为什么要使用这种构架
将和低层和操作的代码和放在Server 端,将和用户交互的代码放在Client 端;
二、通讯使用到的类
l RSessionBase – 客户端连接的基类
三、RSessionBase
定义如下,大部分函数是保护成员,只能从派生类来调用,不能新建一个实例在其它类中调用;
class RSessionBase : public RHandleBase
{
public:
enum TAttachMode {EExplicitAttach,EAutoAttach};
public:
IMPORT_C TInt Share(TAttachMode aAttachMode=EExplicitAttach);
IMPORT_C TInt Attach() const;
protected:
inline TInt CreateSession(const TDesC& aServer,
const TVersion& aVersion);
IMPORT_C TInt CreateSession(const TDesC& aServer,
const TVersion& aVersion,TInt aAsyncMessageSlots);
IMPORT_C TInt Send(TInt aFunction,TAny* aPtr) const;
IMPORT_C void SendReceive(TInt aFunction,TAny* aPtr,
TRequestStatus& aStatus) const;
IMPORT_C TInt SendReceive(TInt aFunction,TAny* aPtr) const;
……
};
Send操作只发送,发送完成就返回,要定义响应的SLOT;在收到回复后,会响应SLOT;最多同时允许255个异步信号(由内核决定,无法通过修改代码实现),超过数量会返回失败;
SendReceive:返回并且会等到回应结果;
Share:要允许Share 才行;Share 方式,第一次使用CreateSession,之后就应该调用Share.
l RMessage – 服务端使用的收到客户端请求数据的类
l DSession – Symbian 内核用来交互服务端和客户端的类
l CSharableSession – 服务端连接的抽象类
l CServer – 服务端从CActive 来的抽象类,用来收取内核的请求并分发到对应的 Session
在实现CServer之前一定要执行 Active Sheduler。
Server工作函数是 RunL, 当有新连接时会调用纯虚函数NewSessionL
l RSubSessionBase
客户端应该避免使用多个RSessionBase,因为这个会消耗系统资源,如果一定要使用多个,可以使用RSubSessionBase。
方法和 RSessionBase 基本相同,但有一点不同时