c++ 客户端/服务器端框架学习笔记

服务器运行于独立的进程中
内核服务器: 该服务器的优先级最高,控制着从其他进程对硬件和内存的访问
                     RTimer
提供异步时间服务
                     RThread
提供线程访问和创建
                     RSemaphore
允许线程间的同步
文件服务器: 该服务器提供对文件系统的访问
                     RFs
提供对文件服务器的会话, 可以完成驱动器, 目录和文件的高层操作
                     RFile
允许文件的创建,读取和写入
                     RDir
读取目录的入口点
窗口服务器: 应用程序框架使用窗口服务器来处理按键事件和屏幕绘制
                     RWindow
用于对屏幕进行绘制,但是在开发中使用不多,用的较多的是对于CCoeControl::Draw()的覆写
                     RAnim
用于对服务器端的动画通信,它在同一线程中的优先级较高
                     CWindowGc
通行上下文,提供了对屏幕进行绘制的函数
字体与位图服务器: 该服务器在客户端共享字体和位图
                                 RFbsSession
负责字体和位图服务器的绘画管理
                                 CFbsBitmap
进行位图处理
                                 CFbsDevice
用于进行位图绘制的图象设备
消息服务器: 可以保存消息数据,并且获取对MMS,SMS,OBEX EMAIL的操作
                     CMsvSession
实现与消息服务器的会话,并且提供对消息存储的接入,以及消息服务器相关提示操作
                     CMsvEntry
提供对消息存储的接入点
                     CBaseMtm
提供高层的接口,用来接入和操作消息服务器接入点
服务器运行与同一个进程的不同线程中
电话服务器:负责设备的电话操作
RTelServer
提供对电话服务器的基本接入,电话扩展模块TSY的载入可以实现对设备电话功能的使用
RPhone
提供对设备上指定电话的操作
                      RLine
提供对电话中某一线路的操作
                      RCall
提供某一线路上的拨号/接听操作
套接字服务器: 提供通过媒介进行tcp/ipudp套接字连接的功能
                        RSocketServ
连接到套接字服务器,并且发现可用协议
                        RSocket
提供与另一个套接字连接,接收和发送数据的功能
                        RHostResolver
进行DNS动态域名服务操作,获取远程设备地址
通信服务器: 允许开发者通过电缆或红外进行串行通信
                         RCommServ
提供与通信服务器的会话
                         RComm
提供通过串行端口进行通信的必要函数


服务器插件
服务器允许采用插件的形式提供对新技术,协议和媒体的支持,例如
消息服务器包括MMS,SMS,POP3,SMTP, .
套接字服务器包括红外,蓝牙,CSD拨号等等
可以看到消息服务器通过一系列的消息协议来进行发送和接收,它允许添加各种消息类型模块MTM

服务器会话
他的结构 CServer2-CSession2-RSessionBase-RSubSessionBase
会话流程
     1.
调用客户端接口API,例如使用文件服务器的客户端API RFs::Drive() 来获得驱动器信息
     2.
调用RSessionBase::SendReceive(),通过传递操作码和指针作为参数,就可以实现服务器对客户端数据进行读取和设置.
     3.
通过内部对函数RSessionBase::SendSync()的调用,实现对内核的调用
     4.
内核调用服务器线程中的CSession2::ServiceL(),并且将消息内容的引用作为参数传递给该函数,并且用操作码来说明进行何种操作
     5.
调用RMessage2:WriteL()对客户端地址空间进行设置
     6.
调用RMessage2::Complete()指示客户端的请求已经完成

下面以文本服务器使用为例

    class RFs : public RSessionBase{...}
    class RFsBase : public RSubSessionBase
    {
      public:
          IMPORT_C void Close();
    };
    class RFile : public RFsBase
    {
       public:
             IMPORT_C TInt Open(RFs& aFs, const TDesc& aName, TUint aFileMode);
             IMPORT_C TInt Create(RFs& aFs, const TDesc& aName, TUint aFileMode);
             IMPORT_C TInt Read(TDesc8& aDes) const;
             IMPORT_C TInt Write(const TDesc8& aDes);
              ....
     }

   
从文本文件读取数据的功能
   
    HBufC8* CFileUtil::ReadL(const TDesC& aFileName)
    {
        RFs fs;
        User::LeaveIfError(fs.Connect());
        CleanupClosePushL(fs);
        RFile file;
        User::LeaveIfError(file.Open(fs, aFileName, EFileRead));
        CleanupClosePushL(file);
        TInt fileSize;
        file.Size(fileSize);
        HBufC8* data = HBufC8::NewL(fileSize);
        file.Read(*data);
        CleanupStack::PopAndDestory(2);
        return data;
    }

实验:这个实验的目的是跟踪调试一段MyApp的程序,来了解一下symbian的执行顺序,下面
是我的实验记录

用向导创建好MyApp程序后,给里面的入口E32Main加上断点,编译执行,顺序如下

E32Main --> NewApplication --> CMyApplication::CreateDocumentL
该函数位于MyAppApplication.cpp -->
CMyAppDocument::NewL
该函数位于MyApp.cpp --> CMyAppDocument::CreateAppUiL该函数位于MyAppDocument.cpp -- > CMyAppAppUi::ConstructL该函数位于MyAppAppUi.cpp -- >
CMyAppAppView::NewL
该函数位于MyAppAppView.cpp
整个流程执行完毕
执行exit菜单项 断点停留在CMyAppAppUi::HandleCommandL该函数位于MyAppAppUi.cpp
因为执行的是exit命令该函数会处理EAknSoftkeyExit命令
再执行,断点停留在CMyAppAppUi的析构函数,用来删除应用程序视图
再实行,断点停留在CMyAppDocument的析构函数
最后退出 , 试验结束

你可能感兴趣的:(C++,c,应用服务器,框架,C#)