服務(wù)器概要設(shè)計_第1頁
服務(wù)器概要設(shè)計_第2頁
服務(wù)器概要設(shè)計_第3頁
服務(wù)器概要設(shè)計_第4頁
服務(wù)器概要設(shè)計_第5頁
已閱讀5頁,還剩5頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

目錄功能概述2網(wǎng)絡(luò)通信層3連接生命周期的管理3接口3異步IO緩沖內(nèi)存池3本地數(shù)據(jù)與字節(jié)流數(shù)據(jù)的互相轉(zhuǎn)換4信令和通信數(shù)據(jù)結(jié)構(gòu)5偽代碼定義5命令管理7數(shù)據(jù)有效性檢測8文件傳輸通道9日志10功能概述服務(wù)器主要業(yè)務(wù)功能是連接物管和終端,為社區(qū)物管和管理中心提供管理功能,使其能夠統(tǒng)一管理終端。服務(wù)器的功能模塊包括:1. 數(shù)據(jù)管理,數(shù)據(jù)包括房屋數(shù)據(jù)、住戶數(shù)據(jù)、配租數(shù)據(jù)、門禁卡數(shù)據(jù)、終端配置數(shù)據(jù)等;2. 狀態(tài)管理,服務(wù)器需要維持物管和終端的連接,保持連接狀態(tài)的可增刪改查;3. 命令管理,物管和終端之間的交互命令有確認機制,命令通過服務(wù)器傳遞,服務(wù)器需要保證命令傳遞的可靠性;4. 數(shù)據(jù)有效性檢測,服務(wù)器需要定期檢測一些數(shù)據(jù)的有效性,包括配租數(shù)據(jù)是否(臨近)到期、門禁卡白名單數(shù)據(jù)與終端定期交換等;5. 文件傳輸通道,包括軟件版本升級、數(shù)據(jù)文件傳輸?shù)龋?. 日志。網(wǎng)絡(luò)通信層通信層負責業(yè)務(wù)命令和數(shù)據(jù)的發(fā)送接收。由于物管、終端和服務(wù)器之間命令和數(shù)據(jù)需要精確送達,所有業(yè)務(wù)都采用TCP來實現(xiàn)。IOCP模型是Windows服務(wù)器開發(fā)中性能最好的非阻塞異步IO模型,所以通信層采用IOCP模型構(gòu)建。Windows下有五種非阻塞I/O模型:選擇(Select)、異步選擇(WSAAsyncSelect)、事件選擇(WSAEventSelect)、重疊I/O(Overlapped I/O)和完成端口(Completion Port)。Select是同步IO模型,同時處理的任務(wù)有限(上限1024),不符合處理成千上萬連接的要求;WSAAsyncSelect也是同步IO模型,以接收Windows消息為基礎(chǔ),不符合服務(wù)器控制臺程序要求;WSAEventSelect也是同步IO模型,需要創(chuàng)建與連接數(shù)等同的事件內(nèi)核對象,資源未能高效利用,也排除在外;上面三種IO模型其實是一回事,都是類select模型,適合開發(fā)小型服務(wù)器或者客戶端程序,而不適合需要接受成千上萬連接的服務(wù)器程序。Overlapped I/O是異步IO模型,但是它需要程序員關(guān)心線程池的實現(xiàn)和調(diào)度(類似Linux下面的epoll模型,但是epoll是同步IO模型);而IOCP克服了上面四種模型的缺點,對實現(xiàn)大連接數(shù)的服務(wù)器有可靠的性能和較少的資源占用,而且伸縮性比較強,占用資源數(shù)跟連接數(shù)量相關(guān),甚至可以用在客戶端程序上面。連接生命周期的管理C+語言沒有對象回收(GC)機制,生命周期的管理和防止內(nèi)存泄露需要程序自己實現(xiàn),而一條連接從產(chǎn)生后到銷毀的過程中會有多個線程同時對其進行操作,同時讀寫甚至同時關(guān)閉,對象的多線程同步也需要程序?qū)崿F(xiàn)。這里采用智能指針(shared_ptr, stl_c+11)來管理連接的生命周期,通信層維護各個連接在內(nèi)存中唯一一份數(shù)據(jù),同時提供引用計數(shù),統(tǒng)計當前該數(shù)據(jù)被外界使用情況,當外界沒有角色再需要該數(shù)據(jù)時(引用計數(shù)減到0),通信層會刪除這份數(shù)據(jù),同時表明該連接生命周期終止。接口數(shù)據(jù)接口采用handle/body手法,連接的handle采用整形數(shù)據(jù),body采用C+對象封裝連接數(shù)據(jù),數(shù)據(jù)包含SOCKET句柄、連接狀態(tài)和當前接收緩存(業(yè)務(wù)層)等。連接生命周期反映到handle上表現(xiàn)為該handle是否為有效。發(fā)送內(nèi)存采用智能指針(unique_ptr, stl_c+11)進行傳遞,這里用到了智能指針對數(shù)據(jù)和數(shù)據(jù)析構(gòu)的封裝,發(fā)送完成之后直接調(diào)用其刪除器(deleter)進行內(nèi)存的刪除,這樣上下層之間就避免了一次內(nèi)存拷貝。回調(diào)接口為C+接口(純虛函數(shù))。異步IO緩沖內(nèi)存池由于系統(tǒng)層和stl層容器都實現(xiàn)了小內(nèi)存內(nèi)存池,所以程序?qū)⒉辉賹崿F(xiàn)自己的內(nèi)存池,發(fā)送緩沖內(nèi)存完全動態(tài)分配,接收緩沖內(nèi)存每個連接有一份,也通過動態(tài)分配而來。本地數(shù)據(jù)與字節(jié)流數(shù)據(jù)的互相轉(zhuǎn)換本地數(shù)據(jù)轉(zhuǎn)換為字節(jié)流數(shù)據(jù)時,根據(jù)本地數(shù)據(jù)大小構(gòu)造字節(jié)流對象,然后將本地數(shù)據(jù)逐字節(jié)填入流中,可變數(shù)組先填入數(shù)組大小再逐個填充數(shù)組內(nèi)容。字節(jié)流數(shù)據(jù)轉(zhuǎn)換為本地數(shù)據(jù)時,根據(jù)字節(jié)流中標識的大小動態(tài)構(gòu)造本地數(shù)據(jù),構(gòu)造時使用智能指針(unique_ptr, stl_c+11)管理數(shù)據(jù),加上C+多態(tài)特性,可以大大簡化內(nèi)存的管理。信令和通信數(shù)據(jù)結(jié)構(gòu)信令設(shè)計的原則是方便數(shù)據(jù)分析,即通過抓包工具得到數(shù)據(jù)后能夠方便地定位到信令所屬業(yè)務(wù)類型。通信數(shù)據(jù)結(jié)構(gòu)的設(shè)計原則是數(shù)據(jù)之間相互獨立,減少耦合,但是又方便擴展,而且方便與本地數(shù)據(jù)之間的轉(zhuǎn)換。由于交互三方(服務(wù)器、終端、物管)采用三種不同的語言來實現(xiàn),數(shù)據(jù)結(jié)構(gòu)的定義必然各有不同,所幸三方都是面向?qū)ο笳Z言,因此可以使用C+定義作為其他兩方的偽代碼來參考。數(shù)據(jù)結(jié)構(gòu)統(tǒng)一處于同一包頭定義下,即都繼承自同一個包頭基類。偽代碼定義class DemoPacket : public PacketHead public: DemoPacket() : PacketHead(0, kPacketTypeDemo, 0) DemoPacket(const PacketHead& head) : PacketHead(head) virtual DemoPacket() override virtual bool Read(PacketReadStream& stream) override if (stream.Read(a_) & stream.Read(b_) & c_.Read(stream) & d_.Read(stream) return true; return false; virtual bool Write(PacketWriteStream& stream) override if (PacketHead:Write(stream) & stream.Write(a_) & stream.Write(b_) & c_.Write(stream) & d_.Write(stream) return true; return false; virtual int CalculateSize() override auto total_size = 0; total_size += PacketHead:CalculateSize(); total_size += sizeof(a_); total_size += sizeof(b_); total_size += c_.CalculateSize(); total_size += d_.CalculateSize(); return total_size; public: BYTE4 a_;/ 四字節(jié)整型字段 BYTE4 b_;/ 四字節(jié)整型字段 PacketArrayBYTE1 c_;/ 字符串字段 PacketArray d_;/ 可變數(shù)組字段,Obj是一個(任意)類;其中BYTE4、PacketArrayBYTE1、PacketArray都是類型名,具體定義不表。命令管理命令需要精確送達,因此必須將命令放入隊列中,待到已經(jīng)精確送達才能移出。隊列需要實現(xiàn)等待機制,因此在每個命令包中加入該命令的序號,對方在確認回包時將此序號一同返回,收到此確認包后根據(jù)序號找到隊列中未完成的命令,將其移出。由于此隊列只存在于內(nèi)存中,服務(wù)器只能保證該隊列中的命令能夠精確送達,一旦程序關(guān)閉,該隊列也會隨之消失,因此其他兩方(物管和終端)也需要加入同步或者異步確認機制,如果接收確認命令超時,因當重發(fā),但是命令序號保持和之前的一致,但是服務(wù)器不保證轉(zhuǎn)發(fā)后的命令序號的一致性,即如果物管發(fā)起一個序號為0x的命令,服務(wù)器轉(zhuǎn)發(fā)此命令給終端時序號可能為0x,但是終端給服務(wù)器確認包的序號必須是0x,而服務(wù)器給物管的確認回包的序號必須是0x。暫時不考慮同時命令數(shù)量超過整型(4字節(jié))(個)范圍的情況。命令移出后內(nèi)存中不可尋,但是會記錄日志。該隊列使用stl標準容器map來實現(xiàn)。數(shù)據(jù)有效性檢測有效性檢測即定時輪詢數(shù)據(jù),查看是否有數(shù)據(jù)達到了需要告知物管或者終端的地步,然后發(fā)送命令告知。效率是這個模塊最需要考慮的問題,因此可以將需要檢測的數(shù)據(jù)全部放入內(nèi)存中進行操作。文件傳輸通道網(wǎng)絡(luò)傳輸層搭建完成之后,文件傳輸通道可以輕松的完成。由于IP層有包頭校驗,TCP層有包頭加數(shù)據(jù)的校驗,以上兩層檢驗算法都是16bit字的二進制反碼和(把需校驗的數(shù)據(jù)看成以16位為單位的數(shù)字組成,依次進行二進制反碼求和),網(wǎng)絡(luò)通信層也有包內(nèi)容校驗,理論上文件數(shù)據(jù)是能保證其完整性的,只需要加一層文件MD5校驗即可。文件傳輸由于數(shù)據(jù)量大,占用帶寬也大,所以應(yīng)當做適度的限速。日志日志分為命令日志和運

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論