亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

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

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

        黃金春,杜娟嬌

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

        0 引言

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

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

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

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

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

        在OJ系統(tǒng)中主要存在兩種請求,分別為題目請求(顯示題目以及提供寫程序的表單)和程序提交請求(完成對提交的程序進行編譯、運行、檢測運行結果等工作)。因為無Web服務器,無法使用不同網(wǎng)頁來區(qū)分請求。但是可以巧妙地使用HttpServer類的create-Context方法虛擬出不同請求來區(qū)分,具體設計是該方法有個上下文參數(shù),構造不同參數(shù)即可實現(xiàn)區(qū)分不同請求,然后再調(diào)用HttpHandler接口實現(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{//對第一種請求響應

        ……}

        static class SHttpHandler implements HttpHandler{//對第二種請求響應

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

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

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

        圖1 題目請求流程

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

        。該部分代碼如下:

        static class MyHttpHandler implements HttpHandler{

        public void handle(HttpExchange httpExchange)throws IOException{

        String responseMsg="";//響應信息

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

        responseMsg=responseMsg+”

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

        byte[]bs=responseMsg.getBytes();

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

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

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

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

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

        圖2 提交處理流程

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

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

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

        Runtime sr;

        Process p;//Process類對象

        String cmd,fdata;

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

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

        try{

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

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

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

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

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

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

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

        讀輸出流類封裝

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

        在線輸入測試數(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)存使用量

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

        (4)程序控制

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

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

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

        3 結語

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

        [1]黃金春等.編寫Web服務器遠程查看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)設計與實現(xiàn)[J].軟件導刊,2016(15)3.

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

        猜你喜歡
        程序數(shù)據(jù)庫方法
        試論我國未決羈押程序的立法完善
        人大建設(2019年12期)2019-05-21 02:55:44
        “程序猿”的生活什么樣
        英國與歐盟正式啟動“離婚”程序程序
        數(shù)據(jù)庫
        財經(jīng)(2017年2期)2017-03-10 14:35:35
        可能是方法不對
        數(shù)據(jù)庫
        財經(jīng)(2016年15期)2016-06-03 07:38:02
        用對方法才能瘦
        Coco薇(2016年2期)2016-03-22 02:42:52
        數(shù)據(jù)庫
        財經(jīng)(2016年3期)2016-03-07 07:44:46
        數(shù)據(jù)庫
        財經(jīng)(2016年6期)2016-02-24 07:41:51
        創(chuàng)衛(wèi)暗訪程序有待改進
        国产午夜亚洲精品一级在线| 欧美寡妇xxxx黑人猛交| 亚洲学生妹高清av| 人妻被猛烈进入中文字幕| 国产91在线精品观看| 亚洲男女内射在线播放| 成人久久久久久久久久久| 日韩AV无码一区二区三| 精品自拍偷拍一区二区三区 | 538在线视频| 中文字幕一区二区av| 亚洲av综合av成人小说| 国内精品久久久久久无码不卡 | 一区二区三区四区亚洲免费| 亚洲中文字幕无码不卡电影| 欧美白人最猛性xxxxx| 免費一级欧美精品| 国产精品综合一区久久| 国产69精品久久久久久久| 欧美色综合高清视频在线| 都市激情亚洲综合一区| 丝袜美腿一区二区国产| 好日子在线观看视频大全免费动漫| 婷婷第四色| 国产中文字幕一区二区视频| av日韩高清一区二区| 免费无码一区二区三区蜜桃| 中文字幕国产欧美| 激情在线视频一区二区三区| 中文字幕人妻丝袜成熟乱| 国产精品毛片无码| 少妇特殊按摩高潮惨叫无码| 伊人久久大香线蕉av色婷婷色| 午夜福利试看120秒体验区| 无遮挡十八禁在线视频国产制服网站| 97超碰中文字幕久久| 亚洲欧洲国产码专区在线观看| 无码熟熟妇丰满人妻啪啪| 青青青草国产熟女大香蕉| 免费人成在线观看播放视频| 精品久久久bbbb人妻|