999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

超小型在線評測系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)

2018-06-13 07:52:42黃金春杜娟嬌
現(xiàn)代計(jì)算機(jī) 2018年13期
關(guān)鍵詞:程序數(shù)據(jù)庫方法

黃金春,杜娟嬌

(1.廣西中醫(yī)藥大學(xué)圖書館信息技術(shù)部,南寧 530021;2.廣西中醫(yī)藥大學(xué)第一附屬醫(yī)院教學(xué)部,南寧 530001)

0 引言

隨著社會的高度發(fā)展,信息技術(shù)應(yīng)用到了社會生活的方方面面,也促使更多的學(xué)生投身到信息技術(shù)開發(fā)的工作中,而程序設(shè)計(jì)能力作為最重要的開發(fā)能力,也日益成為了各個專業(yè)學(xué)生的學(xué)習(xí)要求。提高程序設(shè)計(jì)的能力需要大量的編程實(shí)踐練習(xí),因此很多學(xué)校都開發(fā)了源代碼在線評測系統(tǒng)(Online Judge下稱OJ系統(tǒng))以用來提高學(xué)生的程序設(shè)計(jì)水平。但傳統(tǒng)的OJ系統(tǒng)都比較龐大,需要安裝Web服務(wù)器還需要安裝數(shù)據(jù)庫服務(wù)器,非常不方便在日常的教學(xué)中使用,本文提出一種不需要搭建Web服務(wù)器也不需要搭建數(shù)據(jù)庫服務(wù)器的超小型OJ系統(tǒng),并具體論述系統(tǒng)的實(shí)現(xiàn)。

1 系統(tǒng)基本架構(gòu)

超小型OJ系統(tǒng)雖然不需要Web服務(wù)器以及數(shù)據(jù)庫服務(wù)器,但是同樣實(shí)現(xiàn)Web服務(wù)和數(shù)據(jù)庫服務(wù)功能。系統(tǒng)Web功能基于Java的HTTP Server API開發(fā),這些API主要實(shí)現(xiàn)了HTTP協(xié)議,HTTP協(xié)議是最為流行的網(wǎng)絡(luò)協(xié)議由請求與應(yīng)答協(xié)議構(gòu)成,最主要使用是HttpServer類、HttpHandle接口。HttpServer類實(shí)例實(shí)現(xiàn)監(jiān)聽客戶端的請求,然后HttpServer會調(diào)用HttpHandler接口實(shí)現(xiàn)類的回調(diào)方法來處理客戶端請求。數(shù)據(jù)庫功能采用Sqlite3系統(tǒng)來實(shí)現(xiàn),該數(shù)據(jù)庫非常小巧,僅為一個文件,復(fù)制這個文件即可使用。

2 系統(tǒng)實(shí)現(xiàn)

2.1 建立監(jiān)聽,區(qū)分請求

在OJ系統(tǒng)中主要存在兩種請求,分別為題目請求(顯示題目以及提供寫程序的表單)和程序提交請求(完成對提交的程序進(jìn)行編譯、運(yùn)行、檢測運(yùn)行結(jié)果等工作)。因?yàn)闊oWeb服務(wù)器,無法使用不同網(wǎng)頁來區(qū)分請求。但是可以巧妙地使用HttpServer類的create-Context方法虛擬出不同請求來區(qū)分,具體設(shè)計(jì)是該方法有個上下文參數(shù),構(gòu)造不同參數(shù)即可實(shí)現(xiàn)區(qū)分不同請求,然后再調(diào)用HttpHandler接口實(shí)現(xiàn)類來處理請求。具體代碼如下:

HttpServer httpserver=provider.createHttpServer(new InetSocketAddress(6666),100);//監(jiān)聽

httpserver.createContext("/",new MyHttpHandler());//跟 文 件夾,表示題目請求。

httpserver.createContext("/hjc2",new SHttpHandler());//hjc2

文件夾,表示程序提交請求

……

static class MyHttpHandler implements HttpHandler{//對第一種請求響應(yīng)

……}

static class SHttpHandler implements HttpHandler{//對第二種請求響應(yīng)

特別說明的是,代碼里提到hjc2文件夾,但其實(shí)并不存在這個文件夾,僅作為區(qū)分請求使用。

2.2 實(shí)現(xiàn)題目請求

在OJ系統(tǒng)中,要實(shí)現(xiàn)的第一個請求即為題目顯示請求。其流程如圖1所示。

圖1 題目請求流程

從示意圖看出題目請求由兩個響應(yīng)內(nèi)容合成,一為顯示某個題目的內(nèi)容與要求,另一個為顯示提供學(xué)生做題的表單。題目內(nèi)容從數(shù)據(jù)庫中讀取,用一字符串變量保存,此處涉及數(shù)據(jù)庫讀取等Java操作本文不論述,要指出的是為了保持系統(tǒng)小型化的特色,選用Sqlite3之類的小型數(shù)據(jù)庫。表單的顯示比較簡單,因其為靜態(tài)內(nèi)容只要預(yù)先建立好htm文件用代碼讀取文件即可,要注意的是表單提交的action域必須是含有hjc2的路徑,以便表單提交后作為第二種請求處理。類似:

。該部分代碼如下:

static class MyHttpHandler implements HttpHandler{

public void handle(HttpExchange httpExchange)throws IOException{

String responseMsg="";//響應(yīng)信息

responseMsg=getFromDb();//從數(shù)據(jù)庫讀取內(nèi)容

responseMsg=responseMsg+”

”+getFromHtm();//從htm文件讀取內(nèi)容

byte[]bs=responseMsg.getBytes();

httpExchange.sendResponseHeaders(200,bs.length);//設(shè)置頭屬性及響應(yīng)信息的長度

OutputStream out=httpExchange.getResponseBody();//獲得輸出流

out.write(responseMsg.getBytes());//發(fā)給客戶端

2.3 實(shí)現(xiàn)程序提交請求

該請求為重要的請求。實(shí)現(xiàn)比較復(fù)雜,分為主線程和定時器線程兩個流程,流程圖示如圖2所示。

圖2 提交處理流程

其中主線程主要完成在線編譯,在線輸入測試數(shù)據(jù),在線執(zhí)行以及輸出做題反饋等功能。定時器線程是起到防止程序執(zhí)行時無休止地運(yùn)行,比較簡單,在此僅介紹主線程的實(shí)現(xiàn)。

(1)在線編譯實(shí)現(xiàn)

在日常的程序設(shè)計(jì)中,都是使用IDE環(huán)境進(jìn)行程序的編譯以及運(yùn)行。其實(shí)無論對于C++源程序還是Java源程序還有命令行編譯模式,如Java命令行編譯為執(zhí)行Javac XX.java的命令,在線編譯則必須要運(yùn)行編譯命令。在java環(huán)境下,可以使用Runtime類exec方法來實(shí)現(xiàn)運(yùn)行外部命令,Runtime類封裝了運(yùn)行時的環(huán)境。每個Java應(yīng)用程序都有一個Runtime類實(shí)例,使應(yīng)用程序能夠與其運(yùn)行的環(huán)境相連接。為了對執(zhí)行的程序進(jìn)行控制,不但需要Runtime類,還需要Process類,Runtime類的exec()方法返回一個Process對象,可以使用這個對象控制Java程序與新運(yùn)行的進(jìn)程進(jìn)行交互。這兩個類是實(shí)現(xiàn)主線程里功能重要的類,后面還會使用到。實(shí)現(xiàn)在線編譯的代碼如下:

Runtime sr;

Process p;//Process類對象

String cmd,fdata;

sr=Runtime.getRuntime();//獲取 Running 類實(shí)例

cmd="javac c:\users\hjc\documents\oj\C"+stuid+"_"+subjectid+".java";

try{

p=sr.exec(cmd);//執(zhí)行編譯并返回Process類對象

(2)編譯的輸出信息及在線輸入測試數(shù)據(jù)

要實(shí)現(xiàn)獲取編譯輸出信息,以便進(jìn)行反饋,普通情況下可以使用javac……>>rs.txt等DOS下常用的輸出重定下方法。但在線方式下這方法不行,很多設(shè)計(jì)都采用管道,在此采用流來實(shí)現(xiàn)。但要注意使用什么流,先看流示意圖。

圖3 外部程序與OJ系統(tǒng)流示意圖

從示意圖可以看出,為了獲得外部編譯程序的輸出,采用的是輸入流而不是輸出流,而如果要向外部程序輸入信息則采用輸出流。使用Process對象的getInputStream()方法或者getErrorStream()方法返回輸入流,其中g(shù)etInputStream()返回外部程序的正常輸出,而get-ErrorStream()方法返回是錯誤輸出。在OJ設(shè)計(jì)里編譯部分只關(guān)心的是編譯錯誤,使用錯誤流。獲取編譯信息的代碼如下:

InputStream fis=p.getErrorStream();//取得錯誤結(jié)果的輸出流

InputStreamReader isr=new InputStreamReader(fis);//用 一 個

讀輸出流類封裝

……Read讀流的內(nèi)容

在線輸入測試數(shù)據(jù)的設(shè)計(jì)和獲取編譯錯誤的設(shè)計(jì)類似,但是使用的是輸出流。代碼如下:

OutputStream fin=p.getOutputStream();//取得輸入流

File f=new File("c:\users\hjc\documents\oj\T\t"+subjectid+".data");//測試數(shù)據(jù)文件

……Writer寫入流

(3)執(zhí)行時間與內(nèi)存使用量

在反饋信息中,還有一項(xiàng)重要的內(nèi)容是要獲取程序執(zhí)行的時間及內(nèi)存使用字節(jié)數(shù)。獲取執(zhí)行時間比較簡單,分別在程序開始和結(jié)束時各獲取一次時間,然后計(jì)算兩次時間差即可。獲取內(nèi)存可以使用Runtime類的 freeMemory()方法,如:sr.freeMemory(),也分別在程序開始和結(jié)束時各獲取一次,然后計(jì)算差值。要注意的是在開始時最好使用sr.gc()方法先清理一次內(nèi)存,這樣可以獲取地更為準(zhǔn)確。

(4)程序控制

在OJ設(shè)計(jì)中還要對提交程序的執(zhí)行進(jìn)行控制。提交的程序可能會含有死循環(huán)、破壞性代碼等各種問題,如果不對程序加以控制,很容易造成嚴(yán)重的后果。程序控制主要從兩方面進(jìn)行,一為運(yùn)行時間控制,二為運(yùn)行安全控制。

運(yùn)行時間控制采用定時器和Process類同時控制的方式,具體設(shè)計(jì)是在程序執(zhí)行前,先啟動定時器線程,定時3秒,如果程序能在3秒內(nèi)結(jié)束則認(rèn)為程序是合理的運(yùn)行,如果程序超過3秒,則利用Process類的destroy方法強(qiáng)制停止程序運(yùn)行,并返回超時結(jié)果。

安全運(yùn)行控制。這部分設(shè)計(jì)在很多OJ系統(tǒng)中基本使用C++開發(fā)調(diào)用系統(tǒng)內(nèi)核函數(shù)來實(shí)現(xiàn)(基于Linux的ACM在線評測系統(tǒng)研究),設(shè)計(jì)的較為復(fù)雜。Java在JDK1.6后提供了一個安全管理器,可以對執(zhí)行的Java程序進(jìn)行多方面的限制(該內(nèi)容較多在此不論述),設(shè)計(jì)好限制文件后,在運(yùn)行時加入限制參數(shù)-Djava.security.manager即可以實(shí)現(xiàn)限制模式下運(yùn)行。

3 結(jié)語

計(jì)算機(jī)程序設(shè)計(jì)能力作為當(dāng)今信息社會的一種重要能力愈發(fā)得到學(xué)生們的重視,OJ系統(tǒng)是提高學(xué)生設(shè)計(jì)能力的一種重要工具。本文介紹了一種小型的OJ系統(tǒng)實(shí)現(xiàn),實(shí)踐表明該系統(tǒng)非常小,既不需要安裝Web系統(tǒng)也不需要安裝數(shù)據(jù)庫系統(tǒng),僅有幾個文件完全可以放置在U盤里帶著走,但該系統(tǒng)卻可以實(shí)現(xiàn)大型OJ系統(tǒng)的主要功能。系統(tǒng)非常適用于課堂上課,機(jī)房臨時小型測驗(yàn)等需要快速部署的場所,具有非常強(qiáng)的實(shí)用性。

[1]黃金春等.編寫Web服務(wù)器遠(yuǎn)程查看MySQL數(shù)據(jù)[J].信息系統(tǒng)工程,2009(187).

[2]ITeye博客.JDK6新玩具——HttpServer的使用[EB/OL].http://sunnylocus.iteye.com/blog/460945.

[3]51CTO博客.深入研究java.lang.Runtime類[EB/OL].http://blog.51cto.com/lavasoft/15565.

[4]蔡崇超.基于Web的在線判題系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J].軟件導(dǎo)刊,2016(15)3.

[5]Oracle Help Center.Class SecurityManager[EB].https://docs.oracle.com/javase/7/docs/api/java/lang/SecurityManager.html.

猜你喜歡
程序數(shù)據(jù)庫方法
試論我國未決羈押程序的立法完善
“程序猿”的生活什么樣
英國與歐盟正式啟動“離婚”程序程序
數(shù)據(jù)庫
數(shù)據(jù)庫
用對方法才能瘦
Coco薇(2016年2期)2016-03-22 02:42:52
數(shù)據(jù)庫
數(shù)據(jù)庫
創(chuàng)衛(wèi)暗訪程序有待改進(jìn)
四大方法 教你不再“坐以待病”!
Coco薇(2015年1期)2015-08-13 02:47:34
主站蜘蛛池模板: 色悠久久综合| 亚洲成在线观看| 亚洲一区二区三区国产精品| 五月丁香在线视频| 久久久久中文字幕精品视频| 婷婷六月天激情| 九九九精品视频| 色欲不卡无码一区二区| 国产成本人片免费a∨短片| 99人妻碰碰碰久久久久禁片| 青青草国产在线视频| 看国产毛片| 国产精品人人做人人爽人人添| 精品成人免费自拍视频| 亚洲日韩精品无码专区97| 国产精品粉嫩| 国产在线观看精品| 国模在线视频一区二区三区| 国产经典三级在线| 国产精品污视频| 狂欢视频在线观看不卡| 国产噜噜噜视频在线观看| 欧美精品亚洲精品日韩专区| 91免费在线看| 国产成人精品综合| 亚洲精品亚洲人成在线| 国产三级国产精品国产普男人 | 欧美高清日韩| 午夜小视频在线| 色欲色欲久久综合网| 欧美精品H在线播放| 免费人成视频在线观看网站| 日韩欧美91| 亚洲无码精彩视频在线观看 | 亚洲三级成人| 激情国产精品一区| 最新加勒比隔壁人妻| 强奷白丝美女在线观看| 91精品伊人久久大香线蕉| 精品国产自| 成人福利在线观看| 亚洲天堂福利视频| 精品国产福利在线| 久久综合色天堂av| 亚洲品质国产精品无码| 精品一区二区无码av| 成人国内精品久久久久影院| 成色7777精品在线| 亚洲色欲色欲www在线观看| 国产专区综合另类日韩一区 | 97免费在线观看视频| 欧美成人h精品网站| 亚洲美女一级毛片| 亚洲欧洲日产国产无码AV| 91免费片| 波多野结衣中文字幕一区| 国产美女精品一区二区| 国产人人乐人人爱| 国产精品专区第一页在线观看| 色135综合网| 国产精品伦视频观看免费| 美女内射视频WWW网站午夜| 国产精品太粉嫩高中在线观看| 99草精品视频| 91区国产福利在线观看午夜 | 久久免费视频6| 成人免费网站久久久| 久久国产毛片| 欧美日韩高清在线| 精品剧情v国产在线观看| 波多野结衣亚洲一区| 欧美在线三级| 日韩在线播放中文字幕| 欧美精品啪啪| 国产主播在线观看| 精品福利一区二区免费视频| 亚洲va欧美va国产综合下载| 色综合a怡红院怡红院首页| 国产成人欧美| 亚洲欧美日韩中文字幕在线| 精品一区二区三区水蜜桃| 色噜噜狠狠色综合网图区|