純JAVA實現Online Judge--1.前言簡介
前言
不知不覺,就大四畢業了。由於各個方面的原因吧,我決定了畢業設計做一個Online Judge系統,如今已經答辯完了也準備要繼續回去上班了,告別最後的學生生活。
雖說我這個Online Judge系統做得不是很好,但是過程的中間也踩過不少的坑,而且發現網上用純JAVA實現一個完整的Online Judge系統的文章比較少,都是比較零散並且不完整的,因此在這裡本著拋磚引玉的想法,有了這麼一個系列的部落格,望能與大家一起學習並探討。
本篇部落格先大概介紹一下我的整體設計和系統的簡介,接下來的幾篇部落格會一一介紹我在開發的過程中遇到的坑和解決方法,以及我自認為稍微有點學習意義的技術內容,在本系列最後一篇的博文中,我將會給出我整個系統的原始碼(整個系統分為兩部分(兩個專案):系統的Web端和安全執行使用者提交程式碼的沙箱端)。
最後,祝自己畢業快樂,工作順利吧——2017.6.13
緒論
Online Judge線上程式評測系統簡稱OJ一般指在ACM/ICPC(國際大學生程式設計競賽)等一系列各種程式演算法程式設計競賽比賽中,用於自動化判斷選手程式的正確性,並得出時間記憶體消耗等各項效率指標。
涉及主要框架
Spring+SpringMVC+Mybatis+AngularJS
軟體大概功能圖
系統架構
其中控制層,業務層什麼鬼的,其實就是我們熟悉的Controller,service,dao啦,由於這個圖是論文中用到,由於學校的關係(你懂的),所以這裡採用中文的描述方式啦,使用者模組持久器其實就是UserDao啦~
其實整個系統主要分為兩部分:web端和沙箱端。他們也是兩個獨立的專案。web端主要就是我們熟知的web專案了,這裡就不詳細說了,相信結合上面的圖以及大家的開發經歷,都懂的。沙箱端則主要是用於安全的執行使用者提交的程式碼。依賴於JAVA的類載入機制以及SecurityManager等內容,實現編譯使用者的程式碼之後,可以放心的載入他們的類並通過反射呼叫入口方法main函式,達到安全執行他們程式碼的效果,並最後在給定輸入的情況下,得出使用者程式碼執行的輸出結果。
web端和沙箱端之間,是採用網路進行溝通的。這樣以後擴充套件就比較方便了,如果要做成分散式等高大上之類的話。目前兩者之間的網路交流,都是用socket進行通訊的,就是我們所說的BIO了,沒有使用NIO或者AIO的原因,是因為不想增加開發難度,並且沙箱的數量並不會太多(由於目前架構設計,使得所有沙箱都是執行在同一臺電腦上,CPU資源有限)。再加上的BIO的好處除了簡單易懂之外,延遲也是比較低的。下面給出一個簡化版的圖:
成品系統部分截圖
預告
下一篇部落格中,我將會具體展開裡面的技術細節,並且貼上相關程式碼。由於沙箱端是系統的重點,因此我將會從沙箱端的坑和個人覺得稍微有點學習價值的技術內容,開始講起,謝謝。