蔣 帥, 陳 光, 任卓君
(東華大學(xué) 信息科學(xué)與技術(shù)學(xué)院, 上海 201620)
近幾年,基于Internet的遠(yuǎn)程教育及網(wǎng)絡(luò)教育得到了蓬勃的發(fā)展,各種遠(yuǎn)程教學(xué)系統(tǒng)相繼誕生。目前很多遠(yuǎn)程教學(xué)系統(tǒng)存在一個共同的問題:就是大多數(shù)教學(xué)均以視頻或課件的形式進(jìn)行,這種教學(xué)方式更適合于理論為主的教學(xué),而對于實踐性較強(qiáng)的課程特別是理工科教學(xué)來說,還遠(yuǎn)不能滿足實際需求,因而迫切需要一種遠(yuǎn)程實驗系統(tǒng)來提高網(wǎng)上實踐教學(xué)的能力[1-5]。
遠(yuǎn)程實驗是一個嶄新的概念,是隨著現(xiàn)代計算機(jī)技術(shù)進(jìn)步而產(chǎn)生的一種嶄新的實驗?zāi)J剑?,新加坡國立大學(xué)(NUS)的遠(yuǎn)程實驗室允許用戶通過Internet進(jìn)行遠(yuǎn)程實驗,可以實現(xiàn)昂貴的實驗設(shè)備共享[6]。針對計算機(jī)網(wǎng)絡(luò)這門課程,東華大學(xué)信息學(xué)院網(wǎng)絡(luò)課題組自主研發(fā)了基于B/S模式的遠(yuǎn)程網(wǎng)絡(luò)實驗平臺,學(xué)生用戶通過本機(jī)web瀏覽器自主登錄該平臺,遠(yuǎn)程訪問網(wǎng)絡(luò)設(shè)備進(jìn)行計算機(jī)網(wǎng)絡(luò)實驗。然而實際實驗室的實驗設(shè)備是有限的,如何合理地進(jìn)行資源分配就顯得尤為重要,本文針對這一實際需求,為了能更好、合理的進(jìn)行資源的調(diào)度與分配,設(shè)計并實現(xiàn)了時間、網(wǎng)絡(luò)設(shè)備的在線預(yù)約功能。
本網(wǎng)絡(luò)實驗室的拓?fù)淙鐖D1所示,學(xué)生通過互聯(lián)網(wǎng)來訪問實驗室內(nèi)部網(wǎng)絡(luò),首先要通過VPN的權(quán)限認(rèn)證[7-8]。進(jìn)入實驗室內(nèi)部網(wǎng)絡(luò)后,遠(yuǎn)程服務(wù)器給學(xué)生分配所能訪問的網(wǎng)絡(luò)設(shè)備(交換機(jī)、路由器、以及攝像頭)。交換機(jī)、路由器主要是學(xué)生做網(wǎng)絡(luò)實驗的硬件設(shè)備,攝像頭把網(wǎng)絡(luò)實驗室的實時狀態(tài)反饋給學(xué)生。該遠(yuǎn)程網(wǎng)絡(luò)實驗平臺裝載在遠(yuǎn)程服務(wù)器上,起到對實驗室資源的管理與分配作用。
圖1 平臺硬件組成
開發(fā)平臺選擇Microsoft Visual Studio 2008(VS2008),采用C#作為開發(fā)語言[9-12]。C#語言是.NET的平臺的母語。它的定義主要從C和C++繼承而來。它是一種最新的、面向?qū)ο蟮木幊陶Z言。C#結(jié)合了Microsoft的C++語言結(jié)構(gòu)體,能夠被轉(zhuǎn)換成Web服務(wù),允許任何操作系統(tǒng)上運(yùn)行的任何語言通過Internet被調(diào)用。這樣既保證了操作系統(tǒng)的獨(dú)立性,也保證了語言本身的獨(dú)立性。由于.NET強(qiáng)大的類庫支撐以及VS2008代碼視圖相分離的編程模式,使得基于C#開發(fā)工作變得簡單,大大縮短了研發(fā)周期。涉及到數(shù)據(jù)操作,選用數(shù)據(jù)庫Microsoft SQL Server 2005,來進(jìn)行數(shù)據(jù)的跟蹤訪問、存取和分析[13]。
在線預(yù)約的設(shè)計流程如圖2所示,其基本思想是:在登錄遠(yuǎn)程網(wǎng)絡(luò)實驗平臺進(jìn)行網(wǎng)絡(luò)實驗前,要進(jìn)行時間、實驗設(shè)備等的預(yù)約,即學(xué)生首先通過web瀏覽器進(jìn)行VPN認(rèn)證,然后登錄該實驗平臺的預(yù)約界面并查看“查看實驗室預(yù)約情況”,參考當(dāng)前預(yù)約狀況,找到空閑時間段,避免實驗高峰,然后進(jìn)行預(yù)約。預(yù)約的內(nèi)容包括:實驗內(nèi)容、實驗機(jī)柜、開始時間、結(jié)束時間。點(diǎn)擊執(zhí)行預(yù)約按鈕,如果提示預(yù)約成功,學(xué)生就可以在預(yù)約的時間內(nèi)登錄平臺進(jìn)行網(wǎng)絡(luò)實驗。否則,預(yù)約失敗重新進(jìn)行預(yù)約。
本文所要實現(xiàn)的在線預(yù)約是智能化的,并不需要管理員參與其中。這樣就釋放了管理員這一角色,節(jié)省了管理的精力。要實現(xiàn)這一功能,涉及到復(fù)雜的預(yù)約沖突檢測,這將在下文詳細(xì)闡述。
圖2 在線預(yù)約設(shè)計流程圖
列名數(shù)據(jù)類型允許空idint主鍵非空snumbernvarchar(50)可空equipmentnvarchar(50)可空econtentnvarchar(50)可控stimedatetime可空etimedatetime可空
為了實現(xiàn)遠(yuǎn)程網(wǎng)絡(luò)實驗的在線預(yù)約功能,必須對學(xué)生學(xué)號、時間段、機(jī)柜等數(shù)據(jù)搭建數(shù)據(jù)庫,便于存取、查詢及分析。本文中的數(shù)據(jù)庫系統(tǒng)采用了Microsoft SQL Server 2005。該數(shù)據(jù)庫命名為newmanagement,其數(shù)據(jù)表Ms_order如表1所示:數(shù)據(jù)列id為數(shù)據(jù)庫自動生成的編號,增量設(shè)為1,數(shù)據(jù)列snumber存放預(yù)約學(xué)生的學(xué)號,數(shù)據(jù)列econtent存放預(yù)約的實驗內(nèi)容,數(shù)據(jù)列equipment存儲預(yù)約實驗機(jī)柜信息,數(shù)據(jù)列stime、etime分別存儲預(yù)約的開始、結(jié)束時間,以此來確定預(yù)約的時間段。
本文用自定義的database類中的Do_Insert()方法來實現(xiàn)將學(xué)生的預(yù)約信息插入到數(shù)據(jù)庫newmanagment的Ms_order表中,首先在database類中定義個數(shù)據(jù)庫連接字符串 connstring,用來連接數(shù)據(jù)庫,在Do_Insert()方法體內(nèi)創(chuàng)建一個連接對象conn,用來打開數(shù)據(jù)庫連接,接著創(chuàng)建Sqlcommand對象實例,執(zhí)行該對象下ExecuteNonQuery()方法[14-15],來執(zhí)行數(shù)據(jù)庫更新操作,把學(xué)生的預(yù)約信息錄入到如表1 所示的數(shù)據(jù)表中。主要代碼如下:
public class database
{ string connstring = "server=localhost;user id =***;password=***;database=newmanagement";
public static void Do_Insert(string sql)
{
SqlConnection conn = new SqlConnection();
conn.ConnectionString = connstring;
conn.Open();
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.ExecuteNonQuery();
conn.Close();
}
為了實現(xiàn)在線預(yù)約的智能化,后臺預(yù)約沖突的判斷與檢測必不可少。其邏輯流程圖如圖3所示,這里,經(jīng)過多種邏輯判斷的嵌套,解決了預(yù)約沖突問題。
圖3 沖突檢測邏輯流程圖
在設(shè)計過程中,預(yù)約的實驗內(nèi)容與實驗機(jī)柜信息可用DropDownList控件來實現(xiàn)菜單式的選擇。在線預(yù)約功能的設(shè)計重點(diǎn)是預(yù)約實驗的時間段,在預(yù)約時間選擇方面,有以下三條規(guī)則:
(1) 實驗室開放時間為早上八點(diǎn)到下午五點(diǎn),學(xué)生預(yù)約的時間必須在這范圍內(nèi)。
(2) 預(yù)約的時間格式必須正確。預(yù)約的結(jié)束時間與開始時間必須在同一天,預(yù)約的時間必須在當(dāng)前時間之后,預(yù)約的開始時間必須小于結(jié)束時間,否則系統(tǒng)會給出報錯提醒。
(3) 實驗室資源有限,所以設(shè)定預(yù)約機(jī)制,每個學(xué)生每天只能預(yù)約一次。
實驗時間的選擇采用datetimepicker控件,基于jquery技術(shù)結(jié)合日歷控件和slider控件,定義小時滑動條大小為24,分鐘滑動條大小為60,秒鐘滑動條禁用。當(dāng)拖動滑動條時,便可選擇相應(yīng)的日期和時間。使用textbox控件,定義控件的ID為time1和time2,在頁面前端head中,定義控件的顯示樣式和功能,主要代碼如下所示:
(function(){
('#time1').datetimepicker({
showSecond: true,
timeFormat: 'hh:mm:ss'
});
……
學(xué)生通過datetimepicker控件選擇預(yù)約的時間,點(diǎn)擊確定按鈕。time1,time2的text屬性獲得具體的時間。文本中時間必須轉(zhuǎn)化成datetime類型,然后進(jìn)行預(yù)約時間格式的判斷,主要代碼如下:
timestring = this.time1.Text.Substring(0, 10);
if (!database.iexist(s, timestring))
{if(!database.isexists(timestring))
{string sql = "insert into register(sid,econtent,equipment,stime,etime) values('" + s + "','" + s1 + "','" + s2 + "','" + d1 + "','" + d2 + "') ";
……
在此代碼中,涉及database類中iexist()與iexists()兩種方法,database.iexist()方法用于判斷是不是在同一天預(yù)約,database.isexists()用于判斷,預(yù)約的日期是否重復(fù)。
對于iexist()方法,首先建立連接對象,然后為連接字符串賦值,打開數(shù)據(jù)連接,執(zhí)行SQL語句。將相應(yīng)的數(shù)據(jù)讀取出來,并判斷是否存在記錄,最后關(guān)閉數(shù)據(jù)庫。參數(shù)c代表學(xué)生學(xué)號,參數(shù)d代表學(xué)生預(yù)約日期。程序獲得學(xué)生預(yù)約時間,截取其日期用作參數(shù)d,通過Session變量獲得學(xué)生學(xué)號,SQL語句查詢newmanagement數(shù)據(jù)庫中Ms_order表的stime列判斷用戶在當(dāng)天是否有記錄,主要代碼代碼如下:
sql = "select * from register where (select CONVERT(varchar(10),stime,120)where sid='" + c + "')='" + d + "'";
SqlConnection conn = new SqlConnection(); conn.ConnectionString = connstring;
conn.Open(); SqlCommand comm = new SqlCommand(sql, conn);
SqlDataReader rs = comm.ExecuteReader();
if (rs.Read())
{ return true;}
rs.Close();
return false;
對于iexists()方法,與iexist()方法類似只是SQL語句不同,sql = "select * from register where (select convert(varchar(10),stime,120))='" + a + "'",即通過查詢management數(shù)據(jù)庫中Ms_order表的stime列,截取年月日,來判斷預(yù)約的日期是否重復(fù)。
時間的預(yù)約是在線預(yù)約功能的重點(diǎn)。其基本思路:提取數(shù)據(jù)表Ms_order中stime與etime兩列數(shù)據(jù)中的小時、分鐘信息組成一張表,放在dataset數(shù)據(jù)集中,然后把dataset里存放時間信息的表賦給datable,通過for()循環(huán)對datable表進(jìn)行遍歷,把表里的時間數(shù)據(jù)轉(zhuǎn)化成整型與time1,time2里的時間數(shù)據(jù)進(jìn)行比較,從而進(jìn)行時間段沖突的檢測。
string connstring = "server=localhost;user id =***;password=***;database=management";
SqlConnection con = new SqlConnection();
con.ConnectionString = connstring;
SqlDataAdapter dap = new SqlDataAdapter("select convert(varchar(10),stime,108),convert(varchar(10),etime,108) from register where convert(varchar(10),stime,120)='" + timestring + "'", con);
DataSet ds = new DataSet();
dap.Fill(ds, "Ms_order");
DataTable dt = ds.Tables[0];
for (int k = 0; k < dt.Rows.Count; k++)
{
int p1 = Convert.ToInt32((dt.Rows[k][1].ToString().Replace(":","")));
int p2 = Convert.ToInt32((dt.Rows[k][0].ToString().Replace(":","")));
if ((p2<=d4&&d4<=p1)|| (p2<=d5&&d5<=p1))
{
……
break;
}
string sql2 = "insert into register(sid,excontent,equipment,stime,etime) values ('" + s + "','" + s1 + "','" + s2 + "', '" + d1 + "','" + d2 + "')";
……
break;
}
學(xué)生以用戶名2111044登錄平臺,進(jìn)入預(yù)約系統(tǒng),填入預(yù)約的信息,選擇預(yù)約開始時間為2013-03-29 08:14:00,預(yù)約結(jié)束時間為2013-03-29 09:12:00,實驗內(nèi)容選擇static實驗,實驗機(jī)柜選擇Rack6,點(diǎn)擊執(zhí)行預(yù)約,預(yù)約成功。最后可以點(diǎn)擊“查看實驗室預(yù)約情況”,如圖4所示,表明預(yù)約信息已經(jīng)存儲。
圖4 預(yù)約查詢頁面
某學(xué)號為003的學(xué)生進(jìn)行在線預(yù)約,該生在預(yù)約之前先點(diǎn)擊“查看實驗室預(yù)約情況”,如圖5所示,如果他在預(yù)約界面填入如圖6所示的預(yù)約信息,顯然與圖6中的學(xué)生學(xué)號為2007021214預(yù)約時間段沖突。當(dāng)他點(diǎn)擊“執(zhí)行預(yù)約”按鈕后,將顯示了預(yù)約失敗,預(yù)約沖突檢測成功。
圖5 已預(yù)約信息
經(jīng)過反復(fù)測試,結(jié)果證明,本文提出的結(jié)合預(yù)約信息存儲與預(yù)約沖突檢測的在線預(yù)約功能能夠很好地應(yīng)用在遠(yuǎn)程網(wǎng)絡(luò)實驗平臺上,為實驗室設(shè)備資源的合理分配和調(diào)度提供了技術(shù)支持。
圖6 驗證預(yù)約沖突的輸入信息
基于B/S模式的遠(yuǎn)程網(wǎng)絡(luò)實驗平臺為本校學(xué)生用戶提供了基于網(wǎng)絡(luò)的實驗環(huán)境,大大地拓展了網(wǎng)絡(luò)實驗的外延,提供了實驗的靈活性。本文為遠(yuǎn)程網(wǎng)絡(luò)實驗平臺設(shè)計的在線預(yù)約功能,無疑為平臺的實際應(yīng)用提供了保障。一方面,它為實驗室設(shè)備資源的合理分配和調(diào)度提供了技術(shù)支持。另一方面,通過對實驗時間和實驗設(shè)備的自主在線預(yù)約,減輕了實驗室管理人員的工作壓力,并提高了學(xué)生實驗的自主性,符合開放性原則。
[1] 徐曼瓊.清華大學(xué)強(qiáng)度與振動中心實驗室網(wǎng)上預(yù)約系統(tǒng)的建設(shè)及管理[J].實驗技術(shù)與管理,2006,23(12):137-138.
XU Man-qiong. Building and Managing the Web Reservation System for Central Laboratory of Strength and Vibration in Tsinghua University[J]. Experimental Technology and Management,2006,23(12):137-138.
[2] 陳 希,丁永尚.基于B/S方式的實驗預(yù)約查詢系統(tǒng)設(shè)計[J].實驗技術(shù)與管理,2008,25(7):107-108.
CHEN Xi, Ding Yong-shang. Design of Experiment Booking Inquiry System Based on B/S[J].Experiment Technology and Management,2008,25(7):107-108.
[3] 張亦華.網(wǎng)絡(luò)遠(yuǎn)程實驗的實踐與思考[J].實驗技術(shù)與管理,2002,19(1):89-92.
ZHANG Yi-hua. Practice and Thought of Remote Network Experiment[J]. Experiment Technology and Management,2002,19(1):89-92.
[4] 龐文堯.遠(yuǎn)程實驗技術(shù)發(fā)展現(xiàn)狀[J].科技通報,2004,20(4):311-315.
PANG Wen-yao. Research of Remote Experiment Technology Development[J].Bulletin of Science and Technology,2004,20(4):311-315.
[5] 彭 波,張福義,劉 志.基于Internet遠(yuǎn)程實驗教學(xué)系統(tǒng)[J].實驗室技術(shù)與管理,2007,24(9):97-100.
PENG Bo, ZHANG Fu-yi, LIU Zhi. An Internet-based Experiment Remote-teaching System[J]. Experiment Technology and Management,2007,24(9):97-100.
[6] 殷培強(qiáng).基于網(wǎng)絡(luò)的遠(yuǎn)程控制實驗系統(tǒng)研究與開發(fā)[D].浙江:浙江工業(yè)大學(xué),2007:3-6.
[7] 簡清明.SSL VPN及其在安全遠(yuǎn)程訪問中的應(yīng)用[J].四川理工學(xué)院學(xué)報(自然科學(xué)版),2005,18(1):57-59.
JIAN Qing-ming. SSL VPN and Application in Secure Remote Access[J].Journal of Sichuan University of Science & Engineering(Natural Science Edition),2005,18(1):57-59.
[8] 王愛兵,劉吉強(qiáng).虛擬網(wǎng)卡在VPN網(wǎng)關(guān)中的應(yīng)用[J].計算機(jī)安全,2006,11(11):28-29.
WANG Xue-bin, LIU Ji-qiang. Application of Virtual Network Interface Card in VPN Gateway[J].Network & Computer Security,2006,11(11):28-29.
[9] 明日科技,趙會東.C#開發(fā)之道[M].北京:電子工業(yè)出版社,2011:13-18.
[10] 王小科,徐 薇.C#從入門到精通[M].北京:清華大學(xué)出版社,2010:4-6.
[11] 明日科技.C#開發(fā)經(jīng)驗技巧寶典[M].北京:人民郵電出版社,2007:130-144.
[12] 王小科,王 軍.C#開發(fā)實戰(zhàn)1200例[M].北京:清華大學(xué)出版社,2011:67-107.
[13] 劉麗霞,李俊民.C#范例開發(fā)大全[M].北京:清華大學(xué)出版社,2010:308-349.
[14] 薩師煊,王 珊.數(shù)據(jù)庫系統(tǒng)概論[M].北京:高等教育出版社,2004:94-97.
[15] 朱印宏,蘇震巍.ASP.NET 3.5+SQL Server 網(wǎng)站模塊化開發(fā)全程實錄 [M].北京:清華大學(xué)出版社,2009:126-128.