• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

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

      2018-06-13 07:52:42黃金春杜娟嬌
      現(xiàn)代計(jì)算機(jī) 2018年13期
      關(guān)鍵詞:表單代碼服務(wù)器

      黃金春,杜娟嬌

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

      0 引言

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

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

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

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

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

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

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

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

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

      文件夾,表示程序提交請(qǐng)求

      ……

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

      ……}

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

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

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

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

      圖1 題目請(qǐng)求流程

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

      。該部分代碼如下:

      static class MyHttpHandler implements HttpHandler{

      public void handle(HttpExchange httpExchange)throws IOException{

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

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

      responseMsg=responseMsg+”

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

      byte[]bs=responseMsg.getBytes();

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

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

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

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

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

      圖2 提交處理流程

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

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

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

      Runtime sr;

      Process p;//Process類對(duì)象

      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類對(duì)象

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

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

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

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

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

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

      讀輸出流類封裝

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

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

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

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

      ……Writer寫入流

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

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

      (4)程序控制

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

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

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

      3 結(jié)語

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

      猜你喜歡
      表單代碼服務(wù)器
      電子表單系統(tǒng)應(yīng)用分析
      華東科技(2021年9期)2021-09-23 02:15:24
      通信控制服務(wù)器(CCS)維護(hù)終端的設(shè)計(jì)與實(shí)現(xiàn)
      創(chuàng)世代碼
      創(chuàng)世代碼
      創(chuàng)世代碼
      創(chuàng)世代碼
      淺談網(wǎng)頁制作中表單的教學(xué)
      得形忘意的服務(wù)器標(biāo)準(zhǔn)
      計(jì)算機(jī)網(wǎng)絡(luò)安全服務(wù)器入侵與防御
      基于Infopath實(shí)現(xiàn)WEB動(dòng)態(tài)表單的研究
      電子世界(2012年24期)2012-12-17 10:49:06
      辽阳县| 日土县| 翼城县| 雅江县| 达拉特旗| 许昌县| 定结县| 阿拉善盟| 井陉县| 嵊泗县| 德阳市| 同心县| 沙河市| 葫芦岛市| 鞍山市| 青浦区| 临朐县| 宁乡县| 锦屏县| 西城区| 濉溪县| 铜鼓县| 台前县| 东乌珠穆沁旗| 安徽省| 阿鲁科尔沁旗| 绥芬河市| 陵川县| 盐源县| 临颍县| 洪泽县| 汉沽区| 景洪市| 潮州市| 万安县| 霍林郭勒市| 北海市| 南陵县| 惠水县| 松滋市| 昌黎县|