活動物件中需要的所有非同步服務,都是伺服器通過客戶-伺服器架構來提供的。
上圖中kernel server是灰色的,表示核心伺服器不能被使用者直接訪問使用,它是用來管理其他伺服器的。
伺服器一般採取外掛程式結構,這樣更容易實現模組話,容易管理。
客戶-伺服器架構允許:
1.可擴充套件性:可以新增新外掛程式模組以服務於新物件型別。
2.有效性:相同的伺服器可以服務於多個客戶。
3.安全性:因為一般情況下伺服器及其客戶存在於單獨的程序中,並且通過訊息傳送進行通訊。
4.非同步性:因為伺服器使用活動物件框架來通知它們的客戶工作何時完成。
一、伺服器會話:
r類沒有公共基類,但是r類具有公共基類的伺服器會話:rsessionbase。
rsessionbase提供了在客戶和伺服器之間通訊相對應的部分api。通常不需要直接使用這個基類。
二、伺服器會話和程序間通訊
我們實際使用的是client dll的api,client dll好像就是伺服器在客戶端的乙個**,通過它我們間接的使用伺服器提供的服務。
symbian os核心和記憶體管理單元為每個程序實現不同的記憶體對映位址空間,同時防止無關程序重寫另乙個程序的記憶體。唯一能夠「看到」整個物理記憶體的程序是核心程序自身。所有的執行緒都是核心伺服器的客戶,並且正是核心幫助程序和它們所包含的執行緒之間進行通訊。
class rsessionbase : public rhandlebase
伺服器會話使用createsession()來連線到它的伺服器。通過名稱指定伺服器,而且核心可以使用這個名稱建立連線。可見,該函式為受保護函式,並且rfs::connect()這樣方法將包裝這種呼叫,並且提供乙個簡單的客戶端api,從而呼叫者實際上並不需要知道它所連線的伺服器名稱。
然後,可以將這種連線認為是客戶和伺服器之間的「管道」,通過這種連線路由所有的通訊。通訊自身採用訊息的形式,通過sendreceive()方法從客戶中傳遞訊息。每個過載的方法,帶有乙個函式id(作為乙個tint)和乙個指標,該指標指向具有4個32位值的陣列。
在伺服器端,客戶的訊息表示為乙個rmessage物件:
class rmessage
一旦請求完成,用適當的錯誤碼(很可能是kerrnone)呼叫complete()。在請求同步函式的情況下,這將稱為sendreceive()的返回值。
如果請求非同步函式,這將是trequeststatus的值。
伺服器如何首先獲得訊息?
下面是伺服器端物件的基類,這些物件代表與客戶的會話:
class csharablesession : public cbase
當客戶初始連線時,伺服器建立乙個會話。它呼叫createl()完成構造,同時傳入自身的引用,允許會話訪問它。
當客戶發布請求時,伺服器在相關的會話上呼叫servicel()函式,正是該方法呼叫適當的功能,由訊息的函式id確定這些功能,這些功能作用於訊息中的任何資料。
出於完整性考慮,下面列出cserver的一些宣告:
class cserver : public cactive
注意,所有的伺服器都是從cactive派生而來――它們都是活動物件。startl()方法將它們新增到活動規劃器中,並且啟動它們等待它們的初次請求。實際上由runl()的實現負責在會話上呼叫servicel()。當核心通過訊號通知伺服器的trequeststatus(表示已從客戶傳入請示)時執行。
伺服器自身如何啟動?
這取決於伺服器的特性。在引導系統時啟動許多基本的伺服器,並且它們總是處於可用狀態。其他伺服器,特別是在後面新增到系統中的伺服器,需要在第一次發布請求時,由它們的客戶api顯式的啟動。這種型別的伺服器通常保持對客戶數量的計數,當計數降為0時,該伺服器自動解除安裝自己。
三、伺服器綜述:(1、3、15涉及客戶)
下面給出了伺服器服務於非同步請求的基本過程,假設已經啟動了所討論的伺服器。
1.客戶通過rsession派生物件建立與伺服器的連線,該物件表示客戶端的api
2.伺服器建立與客戶會話關聯的新會話物件
3.客戶通過客戶端的api建立請求
4.根據具體的請求,客戶api將與請求關聯的所有資料報裝為整數、描述符或包描述符。
5.客戶api呼叫sendreceivel(),該函式帶有適當的函式id和引數指標。
6.核心完成伺服器的istatus成員。
7.呼叫伺服器的runl(),通過核心將從客戶處接收到的訊息傳遞給會話的servicel()方法。
8.根據訊息中函式id值,會話的servicel()呼叫適當的服務處理器。
9.使用適當的readl(),服務處理程式從客戶的位址空間中複製資料。
10.服務處理程式服務請求
11.使用適當的writel(),服務處理器將資料複製到客戶位址空間。
12.服務處理器在訊息上以適當錯誤碼,呼叫complete()。
13.核心增加客戶執行緒的訊號量,並且將trequeststatus設定為complete()中指定的值。
14.客戶執行緒的活動規劃器呼叫客戶的runl()方法。
15.客戶的runl()通過客戶api執行對返回資料的所有處理。
四、子會話
每次開啟會話時,需要消耗更多的核心資源。
rfile是乙個子會話。子會話是一種讓客戶與伺服器進行通訊而不需要單個會話來表示每個客戶端物件的輕量級方法。客戶與伺服器建立單個會話,然後為每個物件建立子會話。每個子會話和會話相關聯,藉此進行實際的程序間通訊。
子會話基類rsubsessionbase
class rsubsessionbase
五、伺服器資源的釋放
Symbian OS 檔案伺服器 三
rfile 概述 實現了建立開啟乙個檔案,以及在單一檔案上的所有操作,包括 讀寫檔案 在檔案中定位 在檔案中鎖和解鎖 設定檔案屬性。在使用上面功能時,必須連線乙個檔案伺服器會話,並且檔案處於開啟狀態。開啟檔案的方式 1 使用open 成員函式開啟乙個已存在的檔案,通過設定訪問模式,可以對檔案進行讀或...
伺服器監聽客戶
伺服器端 private void button1 click object sender,eventargs e chatsocket.close acceptedsocket.close catch argumentnullexception es catch socketexception e...
客戶 伺服器模型
在我們日常所見的網路應用程式中,很多都是由客戶 伺服器 c s 模型組成的。伺服器主要承擔著提供資源的責任,通常可以為數量較多的客戶提供服務。今天我們主要來通過乙個最基本的回射伺服器和客戶端模型的編寫,來體會到客戶和伺服器的角色定位,以及對套接字有更深的理解。首先要有一些準備知識,了解在linux下...