施茂祺 魏旻
摘要:傳票翻打是財(cái)經(jīng)工作者必備的一項(xiàng)基本功,也是部分財(cái)經(jīng)類專業(yè)的必備技能,并被列入全國高職會(huì)計(jì)技能比賽的正式項(xiàng)目。為更好組織日常教學(xué)及訓(xùn)練,該研究在分析專業(yè)教師和學(xué)生的實(shí)際需求的基礎(chǔ)上,采用客戶機(jī)/服務(wù)器模型,研發(fā)了傳票翻打測(cè)試軟件。經(jīng)實(shí)證應(yīng)用,效果良好,設(shè)計(jì)思路和采用的技術(shù)手段可行,具有一定的普遍性、適用性和較高的應(yīng)用推廣價(jià)值。
關(guān)鍵詞:零配置分布式;傳票翻打;Client/Server
中圖分類號(hào):TP3? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A? ? ? 文章編號(hào):1009-3044(2018)36-0058-02
1 問題的提出
傳票翻打,或稱傳票算,是指在經(jīng)濟(jì)核算過程中,對(duì)各類單據(jù)、發(fā)票或憑證進(jìn)行匯總計(jì)算的一種方法。一般使用加減計(jì)算,它是加減運(yùn)算在實(shí)際工作中的具體應(yīng)用,可以為會(huì)計(jì)核算、財(cái)會(huì)分析、統(tǒng)計(jì)報(bào)表提供及時(shí)、準(zhǔn)確、可靠的基礎(chǔ)數(shù)字,是財(cái)經(jīng)工作者必備的一項(xiàng)基本功,并被列入全國高職會(huì)計(jì)技能比賽的正式項(xiàng)目。
傳票本分為兩種:
第一種是訂本式傳票,是在傳票的左上角裝訂成冊(cè),一般在比賽中使用。
第二種活頁式,全國會(huì)計(jì)技能大賽采用。
筆者所在學(xué)院為財(cái)經(jīng)類院校,傳票翻打是學(xué)院許多專業(yè)學(xué)生的必備技能,因此,亟需一款供日常教學(xué)及訓(xùn)練用傳票翻打測(cè)試軟件。經(jīng)與相關(guān)專業(yè)教師共同探討和分析,確定自己研發(fā)的傳票翻打測(cè)試系統(tǒng)必須具備的以下功能和特點(diǎn):
1) 系統(tǒng)分為教師端和學(xué)生端兩部分;
2) 學(xué)生端供學(xué)生練習(xí)與測(cè)試,接受學(xué)生輸入的傳票上的數(shù)據(jù)并實(shí)時(shí)匯總,考慮到學(xué)生練習(xí)時(shí)要求手、腦、眼并用,故學(xué)生端應(yīng)能提供學(xué)生一些提示信息,譬如翻打進(jìn)度、速度、正確率等等;
3) 教師端是控制端,教師可在教師端批量導(dǎo)入、導(dǎo)出學(xué)生名單、試題,也可現(xiàn)場(chǎng)編撰題目并布置測(cè)試題,統(tǒng)一設(shè)置測(cè)試時(shí)間,實(shí)時(shí)監(jiān)控每一名學(xué)生的測(cè)試情況,收集并導(dǎo)出學(xué)生考試成績;
4) 性能要求,參考本院實(shí)際班級(jí)人數(shù)以及合班上課的需求,要求系統(tǒng)至少能夠同時(shí)支持150人左右同時(shí)進(jìn)行測(cè)試。
2 系統(tǒng)實(shí)現(xiàn)的關(guān)鍵重點(diǎn)、難點(diǎn)說明
根據(jù)上面系統(tǒng)需求分析, 筆者確定該系統(tǒng)的實(shí)現(xiàn)軟件為客戶機(jī)/服務(wù)器模型,又稱為Client/Server體系結(jié)構(gòu)。服務(wù)器Server通常采用高性能的工作站或PC小型機(jī),并采用Client/Server架構(gòu)數(shù)據(jù)庫系統(tǒng),如Sybase? Oracle或SQL? Server,負(fù)責(zé)供多個(gè)用戶共享其信息和功能??蛻舳薈lient部分通常負(fù)責(zé)執(zhí)行前臺(tái)功能,如與用戶交互,數(shù)據(jù)處理等。這種架構(gòu)由多臺(tái)計(jì)算機(jī)構(gòu)成,它們有機(jī)地組合在一起,協(xié)同完成整個(gè)應(yīng)用,并達(dá)到使系統(tǒng)中的軟件、硬件資源得到最大限度的利用。
本系統(tǒng)服務(wù)器端即為教師端,而客戶端即為學(xué)生端。但是一般Client/Server結(jié)構(gòu)系統(tǒng)在應(yīng)用前都需要進(jìn)行系統(tǒng)部署、設(shè)置和調(diào)試工作,很多情況下,Client/Server架構(gòu)數(shù)據(jù)庫也需要進(jìn)行一系列參數(shù)設(shè)置和環(huán)境設(shè)置,譬如連接時(shí)數(shù)據(jù)庫就至少需要配置連接字符串。由于網(wǎng)絡(luò)環(huán)境不同,連接字符串并非固定不變的,因此往往專業(yè)人員上門進(jìn)行部署和測(cè)試。
考慮到本系統(tǒng)用戶為會(huì)計(jì)類專業(yè)教師,讓他們?nèi)グ惭b和部署Client/Server架構(gòu)數(shù)據(jù)庫存在諸多的困難,因此,本系統(tǒng)在總體架構(gòu)為Client/Server模型的基礎(chǔ)上,后臺(tái)數(shù)據(jù)庫卻選擇了桌面模型數(shù)據(jù)庫Access。之所以選擇Access,是因?yàn)槲④浌疽呀?jīng)將其數(shù)據(jù)庫引擎Jet內(nèi)置到Windows操作系統(tǒng)之中,完全免安裝。但是桌面型數(shù)據(jù)庫應(yīng)用于網(wǎng)絡(luò)環(huán)境,相比Client/Server架構(gòu)的數(shù)據(jù)庫,如SQL? Server,由于整個(gè)數(shù)據(jù)庫都需要傳輸?shù)娇蛻舳诉M(jìn)行處理,造成網(wǎng)絡(luò)帶寬的巨大浪費(fèi),使得性能低下,支持客戶端的數(shù)量有限。為此,筆者考慮研究實(shí)現(xiàn)一個(gè)分布式框架,該分布式框架可將桌面架構(gòu)數(shù)據(jù)庫虛擬為Client/Server架構(gòu)數(shù)據(jù)庫,并可實(shí)現(xiàn)零配置,其具備以下特點(diǎn):
1) 該框架適用于小型分布式程序。
2) 原生框架,不依賴當(dāng)前流行的Java、.Net虛擬機(jī)運(yùn)行時(shí)環(huán)境,這樣才能保證無需任何配置,拷貝到電腦上即可使用。
3) 將桌面型或嵌入式數(shù)據(jù)庫轉(zhuǎn)換為Client/Server架構(gòu)數(shù)據(jù)庫,服務(wù)器端無需安裝數(shù)據(jù)庫服務(wù)器,如SQL? Server,客戶端無需單獨(dú)安裝數(shù)據(jù)庫驅(qū)動(dòng),并且做到網(wǎng)絡(luò)線路上只有請(qǐng)求流和結(jié)果流,能更有效地利用網(wǎng)絡(luò)帶寬,從而達(dá)到高性能。
4) 程序員使用本框架開發(fā)軟件簡單易用,如同開發(fā)桌面型數(shù)據(jù)庫一樣簡單。
3 實(shí)現(xiàn)思路
3.1 整體結(jié)構(gòu)
如圖1所示,Client通過自定義協(xié)議向Server發(fā)送請(qǐng)求,Server監(jiān)測(cè)Client連接請(qǐng)求,為每一個(gè)Client連接請(qǐng)求生成一個(gè)服務(wù)線程,考慮到每一個(gè)連接都需要一定的系統(tǒng)開銷,所以Server自己維護(hù)連接歸入池中。因此,線程池負(fù)責(zé)分配管理和釋放Client連接,允許系統(tǒng)重復(fù)使用一個(gè)現(xiàn)有連接,而不是重新建立一個(gè)。
該線程是衍生的會(huì)話線程,其內(nèi)封裝了客戶端IP、端口號(hào)、Client發(fā)送的數(shù)據(jù)包等大量信息。同樣,為提高性能,系統(tǒng)在啟動(dòng)時(shí)一次性生成一定數(shù)量的數(shù)據(jù)訪問對(duì)象(ADO),并放入對(duì)象池中。當(dāng)程序需要一個(gè)新的對(duì)象時(shí),如果對(duì)象池中有空閑對(duì)象,則立即返回,否則才創(chuàng)建新的該類對(duì)象。當(dāng)一個(gè)對(duì)象不再被使用時(shí),應(yīng)該將其放回對(duì)象池,以便程序后來使用。并提供了一組方法用于與客戶端通信,其原型形如:
class? CClientThread:CThread
private:
bool? FTS;
void*FChunkbuf;
bool? Fiskeepalive;
char*Fpeekbuffev;
string GlobalPeerIpAddress;
int? GlobalPeerPort;
public:
bool? Connect();
bool? Listen();
int? Sendbuf(const? void*buf,int? count);
int? Write(char? c);
int? Write(const? string? s);
int? Write(void *buf,int? len);
int? Read(void *buf,int? len);
int? ReadInt()
bool? SaveTo(CStream* stream,unsigned? timeout);
bool? SaveTo(File? handle, unsigned? timeout);
3.2 網(wǎng)絡(luò)協(xié)議的設(shè)計(jì)
Client/Server是一種請(qǐng)求-響應(yīng)模型,在一次完整的通信過程中,Client與Server之間將完成以下步驟:
1) 建立TCP連接,通過socket建立Client與Server之間的TCP連接。
2) Client向Server端發(fā)送命令,與http協(xié)議類似,命令存放在協(xié)議報(bào)文頭信息中。
3) Client發(fā)送協(xié)議報(bào)文信息。Client在發(fā)送請(qǐng)求命令之后,還要以協(xié)議報(bào)文的形式向服務(wù)器發(fā)送請(qǐng)求的具體參數(shù)。
4) Server應(yīng)答,Server會(huì)向Client返回響應(yīng),主要是響應(yīng)狀態(tài)碼。
5) Server返回協(xié)議報(bào)文,發(fā)送Client所請(qǐng)求的實(shí)際數(shù)據(jù)。
本系統(tǒng)設(shè)計(jì)了如下,一些整數(shù)作為協(xié)議頭信息:
1) CTSLOGIN=1;成功登陸標(biāo)記;
2) CRESPOK=1;返回狀態(tài)碼,‘1表示響應(yīng)成功;
3) CRESPFAULT=2;返回狀態(tài)碼,‘2表示響應(yīng)失敗;
4) CRESULTOK=0;返回結(jié)果正確;
5) CRESULTNO=0;返回結(jié)果錯(cuò)誤;
6) DISONN=0;斷開連接;
7) EXESQL=1;執(zhí)行SQL結(jié)句;
8) OPENSQL=2;打開SQL結(jié)句;
9) LINKTEST=2;連接測(cè)試;
10) ACTIVEPACK=4;激活包。
3.3 系統(tǒng)的運(yùn)作流程
如圖2所示,Server和Client內(nèi)部存在一個(gè)工作循環(huán),Server是一個(gè)監(jiān)聽循環(huán),在循環(huán)內(nèi)Server通過讀取客戶端請(qǐng)求協(xié)議頭信息得知請(qǐng)求意圖,這將觸發(fā)Server做出不同的響應(yīng)動(dòng)作,其邏輯通過偽碼說明如下:
switch(IHead) {? //對(duì)協(xié)議頭信息進(jìn)行判斷
case? EXESQL:? // //執(zhí)行一條SQL語句 更新或者執(zhí)行
Llen = ClientThread→Socket→ReadInteger;
LSQl = ClientThread→Socket→ReadStr(Llen);
ADOQuery→SQL.Clear;
ADOQuery→SQL→Add(LSQl);
ADOQuery→Execute;
break;
case? OPENSQL:? //執(zhí)行一個(gè)查詢語句
Llen = ClientThread→Socket→ReadInteger;
LSQl = ClientThread→Socket→ReadStr(Llen);
ADOQuery→SQL.Clear;
ADOQuery→SQL→Add(LSQl);
ADOQuery→Open();
break;
…
}
3.4 結(jié)果集的返回
Client/Server架構(gòu)的數(shù)據(jù)庫,可根據(jù)Client查詢請(qǐng)求返回相應(yīng)的結(jié)果集,避免了在網(wǎng)絡(luò)上傳播無效數(shù)據(jù),有效地利用了網(wǎng)絡(luò)帶寬,提高了系統(tǒng)性能。本系統(tǒng)采用了流處理機(jī)制(Stream)對(duì)數(shù)據(jù)集對(duì)象(ADO)序列化和反序列化,利用AdoDataSet數(shù)據(jù)集SaveToFile方法將數(shù)據(jù)集保存到文件中,再通過內(nèi)存流(MemoryStream)緩存在內(nèi)存中,使用 ZIP壓縮算法在壓縮內(nèi)存流中的數(shù)據(jù)后返回給Client,Client收到響應(yīng)數(shù)據(jù)后進(jìn)行反序列化即可還原出該數(shù)據(jù)集對(duì)象(ADO)。由于網(wǎng)絡(luò)上傳輸?shù)臄?shù)據(jù)是經(jīng)過壓縮的,進(jìn)一步提高了系統(tǒng)性能。
4 結(jié)束語
本系統(tǒng)開發(fā)完成后,一直應(yīng)用于江西財(cái)經(jīng)職業(yè)學(xué)院會(huì)計(jì)及相關(guān)專業(yè)教學(xué)之中,并選作了近幾年江西省大學(xué)生會(huì)計(jì)技能競(jìng)賽軟件,效果良好,證明其設(shè)計(jì)思路和采用的技術(shù)手段是可行的,具有一定的普遍性和適用性以及較高的推廣價(jià)值。
參考文獻(xiàn):
[1] 劉向東.基于Client/Server結(jié)構(gòu)的數(shù)據(jù)庫系統(tǒng)設(shè)計(jì)[J].電腦知識(shí)與技術(shù),2018,14(11):8-10.
[2] 孟繁榮.中職傳票翻打技能比賽有效訓(xùn)練的實(shí)踐及研究[J].科教導(dǎo)刊:中旬刊,2016(04):42-43.
[3] 狄慶貴.基于Client/Server技術(shù)的質(zhì)量信息管理系統(tǒng)[J].中國管理信息化,2017,20(10):50-51.
[通聯(lián)編輯:張薇]