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

        ?

        面向教學(xué)的Web服務(wù)器的設(shè)計(jì)與實(shí)現(xiàn)

        2007-12-31 00:00:00鄒昌偉
        計(jì)算機(jī)教育 2007年16期

        摘要:本文設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)面向教學(xué)的且支持程序員級(jí)別動(dòng)態(tài)網(wǎng)頁(yè)二次開發(fā)的Web服務(wù)器。

        關(guān)鍵詞:Web服務(wù)器;面向教學(xué);JSP/Servlet

        中圖分類號(hào):G64 文獻(xiàn)標(biāo)識(shí)碼:A

        文章編號(hào):1672-5913 (2007) 17-0067-04

        1引言

        Web服務(wù)器是進(jìn)行互聯(lián)網(wǎng)應(yīng)用開發(fā)的基礎(chǔ)。在它剛剛出現(xiàn)的時(shí)侯,Web服務(wù)器提供的只是靜態(tài)HTML網(wǎng)頁(yè)的服務(wù),在Web服務(wù)器收到一個(gè)來(lái)自瀏覽器的請(qǐng)求時(shí),它會(huì)把服務(wù)器上與請(qǐng)求資源URI(統(tǒng)一資源標(biāo)志符)相對(duì)應(yīng)的靜態(tài)文件通過HTTP協(xié)議傳給Web瀏覽器。隨著技術(shù)的發(fā)展,如何提供動(dòng)態(tài)網(wǎng)頁(yè)的服務(wù)成為關(guān)注的焦點(diǎn)。由此人們實(shí)現(xiàn)了IIS、Apache Tomcat和Weblogic等諸多技術(shù)成熟且功能強(qiáng)大的服務(wù)器,引入了ASP和JSP/Servlet等諸多技術(shù)和規(guī)范。以Tomcat為例,它是JSP/Servlet規(guī)范的參考實(shí)現(xiàn)[1]。但在教學(xué)與實(shí)驗(yàn)中,學(xué)生在學(xué)習(xí)JSP/Servlet時(shí)很容易陷于龐大的API(應(yīng)用程序接口)中,浮于各個(gè)方法(函數(shù))是如何使用等表面問題上,而忽視了對(duì)技術(shù)真正實(shí)現(xiàn)機(jī)制的理解。為使學(xué)生掌握技術(shù)的實(shí)現(xiàn)機(jī)理,盡管采用了多媒體等諸多教學(xué)輔助手段,但是學(xué)生對(duì)Web服務(wù)器的幕后機(jī)制還是一知半解。為解決這樣的問題,在教學(xué)與實(shí)驗(yàn)中結(jié)合一個(gè)具體的Web服務(wù)器的源碼來(lái)分析與學(xué)習(xí)就很有必要。由此可揭示相關(guān)技術(shù)的真正實(shí)現(xiàn)機(jī)制,使學(xué)生能透過現(xiàn)象看本質(zhì),不是浮于對(duì)各種動(dòng)態(tài)網(wǎng)頁(yè)技術(shù)的API的死記硬背上。目前市面上已有不少開源的Web服務(wù)器,Tomcat就是一個(gè)例子,但是它們相對(duì)教學(xué)而言還是太過復(fù)雜。基于此,本文設(shè)計(jì)并用Java語(yǔ)言實(shí)現(xiàn)了一個(gè)接口簡(jiǎn)單但支持二次開發(fā)的Web服務(wù)器(為之命名為MyServer),內(nèi)置了用于會(huì)話跟蹤的機(jī)制,提供了簡(jiǎn)明的用于二次開發(fā)的接口MyServlet,并充分考慮到了教學(xué)實(shí)驗(yàn)的需求,把MyServer服務(wù)器源代碼的規(guī)??刂圃谝磺凶笥遥?duì)服務(wù)器的各個(gè)功能模塊作了較好的劃分,以便于學(xué)生的閱讀與理解。

        2MyServer服務(wù)器的設(shè)計(jì)

        從總體上而言,MyServer服務(wù)器能提供的服務(wù)可分為兩類:一是靜態(tài)網(wǎng)頁(yè)的服務(wù),包括HTML頁(yè)面、圖片、音頻和視頻文件;二是動(dòng)態(tài)網(wǎng)頁(yè)的服務(wù),為此MyServer服務(wù)器需要內(nèi)置方便程序員二次開發(fā)的相關(guān)機(jī)制,包括會(huì)話(MySeesion)的管理、用來(lái)產(chǎn)生動(dòng)態(tài)頁(yè)面的MyServlet組件(使用MyServer服務(wù)器的程序員可通過實(shí)現(xiàn)MyServlet接口來(lái)產(chǎn)生動(dòng)態(tài)網(wǎng)頁(yè))的自動(dòng)加載與管理、請(qǐng)求消息的解析和響應(yīng)消息的產(chǎn)生。MyServer服務(wù)器上的靜態(tài)網(wǎng)頁(yè)服務(wù)和動(dòng)態(tài)網(wǎng)頁(yè)服務(wù)既有相同之處又有不同之處。兩者的共同之處是對(duì)于來(lái)自瀏覽器的每個(gè)請(qǐng)求,MyServer服務(wù)器都會(huì)啟動(dòng)一個(gè)新的線程ServerThread,由此線程從原始的HTTP請(qǐng)求消息中提取出請(qǐng)求URI,然后在服務(wù)器上查找相應(yīng)的資源來(lái)給瀏覽器作響應(yīng)。它們的不同之處在于:對(duì)于靜態(tài)網(wǎng)頁(yè)的服務(wù)而言,MyServer服務(wù)器只要把服務(wù)器上與請(qǐng)求URI相對(duì)應(yīng)的靜態(tài)文件通過HTTP協(xié)議傳給Web瀏覽器即可;而對(duì)于動(dòng)態(tài)網(wǎng)頁(yè)的服務(wù)而言,服務(wù)器需要進(jìn)一步解析請(qǐng)求消息,從中提取來(lái)自瀏覽器的請(qǐng)求參數(shù)和頭域信息,同時(shí)還要找到與URI相匹配的MyServlet組件,由此組件來(lái)產(chǎn)生動(dòng)態(tài)響應(yīng),如果相關(guān)的MyServlet組件還未被加載,則MyServer服務(wù)器還應(yīng)動(dòng)態(tài)載入相關(guān)的MyServlet組件類,生成該類的實(shí)例化對(duì)象,并把由MyServer服務(wù)器自動(dòng)生成的代表解析后的當(dāng)前請(qǐng)求消息的MyRequest對(duì)象和代表當(dāng)前響應(yīng)消息的MyResponse對(duì)象傳給MyServlet對(duì)象,MyServlet對(duì)象就可以根據(jù)當(dāng)前請(qǐng)求的方法是GET還是POST來(lái)調(diào)用相應(yīng)的doGet或doPost方法來(lái)作處理。MyServer服務(wù)器的運(yùn)行界面如下所示。

        基于以上的分析,同時(shí)考慮教學(xué)與實(shí)驗(yàn)的要求,把MyServer服務(wù)器分為以下幾大功能模塊:

        (1) 主模塊:負(fù)責(zé)監(jiān)聽服務(wù)器端口,如果有來(lái)自瀏覽器的HTTP請(qǐng)求,則生成一個(gè)新的線程來(lái)處理當(dāng)前請(qǐng)求,同時(shí)主模塊還應(yīng)負(fù)責(zé)管理所有的會(huì)話信息、維護(hù)所有的MyServlet組件和相關(guān)的配置文件。在此模塊中,學(xué)生可通過源碼的分析和學(xué)習(xí),領(lǐng)悟服務(wù)器與瀏覽器之間如何建立連接,服務(wù)器如何實(shí)現(xiàn)多線程的響應(yīng)機(jī)制,如何提供同步機(jī)制以實(shí)現(xiàn)對(duì)相關(guān)數(shù)據(jù)的并發(fā)訪問。

        (2) 線程模塊:在此模塊中處理自瀏覽器的當(dāng)前請(qǐng)求,在此模塊中應(yīng)生成代表當(dāng)前請(qǐng)求消息的MyRequest對(duì)象和代表當(dāng)前響應(yīng)的MyReponse對(duì)象,如果請(qǐng)求的是動(dòng)態(tài)資源,還應(yīng)動(dòng)態(tài)加載相關(guān)的MyServlet組件。在此模塊中,學(xué)生可體會(huì)如何在線程中處理一個(gè)HTTP請(qǐng)求。

        (3) 請(qǐng)求模塊:在此模塊中完成對(duì)HTTP請(qǐng)求消息的解析,包括對(duì)請(qǐng)求行、請(qǐng)求首部和請(qǐng)求體(對(duì)POST請(qǐng)求而言)的解析,在此模塊中可抽象出代表解析后的當(dāng)前請(qǐng)求消息的類MyRequest。在此模塊中,學(xué)生可學(xué)習(xí)HTTP請(qǐng)求消息的組織格式,并學(xué)習(xí)如何從原始的HTTP請(qǐng)求消息中提取出所需的數(shù)據(jù)。

        (4) 響應(yīng)模塊:在此模塊中實(shí)現(xiàn)服務(wù)器對(duì)瀏覽器響應(yīng)消息的處理,從中可抽象出代表當(dāng)前響應(yīng)消息的類MyResponse。學(xué)生可在此模塊中學(xué)習(xí)HTTP響應(yīng)消息的組織格式,并學(xué)習(xí)如何去設(shè)置響應(yīng)消息的狀態(tài)碼和相關(guān)頭域,如何向?yàn)g覽器輸出各種類型的響應(yīng)消息。

        (5) 動(dòng)態(tài)模塊:在此模塊中定義了MyServer服務(wù)器上程序員二次開發(fā)所需的MyServlet接口和管理當(dāng)前會(huì)話的MySession類。學(xué)生通過對(duì)此模塊的分析,可真正明白會(huì)話的概念是如何抽象出來(lái)的。同時(shí)學(xué)習(xí)Web服務(wù)器是如何支持程序員級(jí)別的二次開發(fā)。

        3MyServer服務(wù)器的實(shí)現(xiàn)

        在用Java語(yǔ)言實(shí)現(xiàn)MyServer服務(wù)器時(shí),考慮了這樣的兩個(gè)原則:一是實(shí)現(xiàn)MyServer服務(wù)器的宗旨是服務(wù)教學(xué),通過服務(wù)器源碼的學(xué)習(xí)讓學(xué)生把握事物的本質(zhì),為此不作過多的安全方面的考慮,以避免學(xué)生陷入其他無(wú)關(guān)的主題中;二是MyServer服務(wù)器提供的用于二次開發(fā)的API力求成為或類似于現(xiàn)有的技術(shù)標(biāo)準(zhǔn)Servlet規(guī)范的某個(gè)子集,這樣學(xué)生便可順利地從MyServer服務(wù)器源碼的分析轉(zhuǎn)入對(duì)JSP/Servlet等工業(yè)化技術(shù)標(biāo)準(zhǔn)和規(guī)范的學(xué)習(xí)或者也可很方便地從JSP/Servlet規(guī)范的學(xué)習(xí)轉(zhuǎn)入對(duì)MyServer服務(wù)器源碼的分析上。

        3.1主模塊的實(shí)現(xiàn)

        在主模塊中,首先通過生成一個(gè)java.net.Server Socket對(duì)象[2],來(lái)監(jiān)聽服務(wù)器上的相應(yīng)端口是否存在來(lái)自瀏覽器的連接,如果沒有連接則當(dāng)前線程阻塞,直到有連接為止。當(dāng)監(jiān)聽到來(lái)自瀏覽器的連接時(shí),則把代表當(dāng)前連接的socket對(duì)象作為參數(shù)傳給ServerThread線程的構(gòu)造方法,進(jìn)而啟動(dòng)一個(gè)新線程來(lái)處理當(dāng)前請(qǐng)求。

        ServerSocket server = new ServerSocket(80);

        //啟動(dòng)服務(wù)器

        Socket socket = server.accept();

        //監(jiān)聽

        socket.setSoTimeout(100);

        //設(shè)置超時(shí)時(shí)間

        new ServerThread(this,socket).start();

        //生成線程處理響應(yīng)

        代表當(dāng)前連接的socket應(yīng)設(shè)置一個(gè)超時(shí)時(shí)間(此處設(shè)為100毫秒),此超時(shí)時(shí)間的主要作用是避免從socket輸入流讀取數(shù)據(jù)時(shí)陷入無(wú)限等待中。若從Socket讀數(shù)據(jù)時(shí)的等待時(shí)間超過了規(guī)定的超時(shí)時(shí)間,則會(huì)拋出一個(gè)超時(shí)異常,此時(shí)可認(rèn)為來(lái)自瀏覽器的輸入流中的數(shù)據(jù)已經(jīng)讀完。

        而對(duì)于各個(gè)會(huì)話對(duì)象MySession的管理,則采用哈希表的數(shù)據(jù)結(jié)構(gòu),其中存放<會(huì)話編號(hào)SessionId,MySession對(duì)象>的有序?qū)?。因?yàn)樘幚鞨TTP請(qǐng)求的每個(gè)ServerThread線程中可能都要訪問會(huì)話信息,所以對(duì)于此哈希表的訪問應(yīng)通過同步方法,而產(chǎn)生SessionId的方法也應(yīng)設(shè)應(yīng)為同步,以避免出現(xiàn)同編號(hào)的會(huì)話。同時(shí)主模塊中還應(yīng)維護(hù)請(qǐng)求URI與MyServlet組件的映射表,這部分信息存于服務(wù)器的配置文件中。在服務(wù)器啟動(dòng)時(shí),應(yīng)從配置文件中讀入映射信息。配置文件采用XML的數(shù)據(jù)格式,下例表示的是請(qǐng)求URI為/index.html的請(qǐng)求應(yīng)由名為HelloServelt的MyServlet組件來(lái)處理。

        cn.edu.fjnu.examples.HelloServlet

        3.2線程模塊的實(shí)現(xiàn)

        在此模塊中,抽象出線程類ServerThread,它的構(gòu)造方法中有一參數(shù)為Socket類型,用來(lái)存放與當(dāng)前請(qǐng)求對(duì)應(yīng)的Socket連接。在此線程的構(gòu)造方法中分別生成MyRequest和MyResponse對(duì)象(分別由由請(qǐng)求模塊和響應(yīng)模塊來(lái)實(shí)現(xiàn)),由MyRequest對(duì)象獲得請(qǐng)求URI,先查找主模塊中維護(hù)的請(qǐng)求URI與MyServlet組件的映射表,如果找不到與當(dāng)前URI對(duì)應(yīng)的MyServlet組件,則在服務(wù)器的本地文件系統(tǒng)中查找相應(yīng)的靜態(tài)文件,如果仍然找不到,則表示不存在瀏覽器所請(qǐng)求的資源,可設(shè)置響應(yīng)狀態(tài)碼為404。而如果存在與請(qǐng)求URI相對(duì)應(yīng)的MyServlet組件,則要?jiǎng)討B(tài)的加載相應(yīng)的MyServlet組件類,生成該類的一個(gè)實(shí)例對(duì)象,再調(diào)用此對(duì)象的doPost或doGet方法來(lái)處理請(qǐng)求,產(chǎn)生動(dòng)態(tài)響應(yīng)。因?yàn)榇嬖诓煌挠脩粽?qǐng)求相同頁(yè)面的情況,所以新生成的MyServlet實(shí)例對(duì)象應(yīng)存放到主模塊中的URI與MyServlet組件映射表中以便復(fù)用。MySevlet組件類的動(dòng)態(tài)加載與實(shí)例化的過程如下:

        Class c = Class.forName(“類名”);

        //動(dòng)態(tài)加載MyServlet類

        Object servlet = c.newInstance();

        //實(shí)例化

        3.3請(qǐng)求模塊的實(shí)現(xiàn)

        在請(qǐng)求模塊中抽象出了MyRequest類,用來(lái)表示來(lái)自瀏覽器的當(dāng)前請(qǐng)求消息。該類的構(gòu)造方法中有一代表當(dāng)前連接的參數(shù)socket(為Socket類型),因?yàn)槲覀冊(cè)谥髂K中已經(jīng)設(shè)了此socket對(duì)象的超時(shí)時(shí)間[3],所以通過此輸入流讀取數(shù)據(jù)時(shí)若等待的時(shí)間過長(zhǎng)則會(huì)產(chǎn)生異常,服務(wù)器認(rèn)為來(lái)自瀏覽器的數(shù)據(jù)已經(jīng)讀完。而在Java的I/O中,一般是用返回-1來(lái)表示輸入流的數(shù)據(jù)已經(jīng)讀完。為此,我們可新建一個(gè)繼承java.io.BufferedInputStream的類ServletInputStream,改寫其read()方法,在方法體中捕獲到超時(shí)異常時(shí)則返回-1。在作了這樣的處理之后,就可用以下方式來(lái)獲取來(lái)自瀏覽器的輸入流:

        BufferedInputStream in =

        new ServletInputStream (socket. getInput Stream());

        并可進(jìn)一步抽象出請(qǐng)求分析器RequestAnalyzer,由它專門負(fù)責(zé)解析ServletInputStream流中的HTTP請(qǐng)求消息。

        RequestAnalyzer analyzer = new RequestAnalyzer(in);

        while((input = in.read()) != -1){

        //不斷讀入當(dāng)前字節(jié)進(jìn)行分析

        }

        請(qǐng)求分析器應(yīng)從輸入流中提取請(qǐng)求行中的請(qǐng)求方法、請(qǐng)求URI和協(xié)議信息,提取請(qǐng)求首部的頭域信息(特別的要提取出響應(yīng)模塊中加入的Cookie信息,其中包含了會(huì)話編號(hào)SessionId,以進(jìn)行會(huì)話跟蹤),而請(qǐng)求參數(shù)的提取則要根據(jù)請(qǐng)求行中提取的請(qǐng)求方法是GET還是POST來(lái)作處理。如果是GET請(qǐng)求,則要從請(qǐng)求URI中附加的查詢字符串中提取,而如果是POST請(qǐng)求,則要從消息體中提取。提取的請(qǐng)求參數(shù)要用java.net.Decoder對(duì)請(qǐng)求參數(shù)進(jìn)行解碼。

        3.4響應(yīng)模塊的實(shí)現(xiàn)

        響應(yīng)模塊主要負(fù)責(zé)處理輸出給給瀏覽器的響應(yīng)消息,由此抽象出類MyResponse用來(lái)表示當(dāng)前響應(yīng)。它的構(gòu)造方法中一個(gè)有表示當(dāng)前連接的參數(shù)socket(為Socket類型),由socket.getOutputStream可獲得輸出流。為了方便程序員級(jí)別的二次開發(fā),MyServer服務(wù)器應(yīng)對(duì)響應(yīng)消息作預(yù)處理,即HTTP響應(yīng)消息的狀態(tài)行和消息首部的輸出應(yīng)由MyServer服務(wù)器負(fù)責(zé)。程序員只負(fù)責(zé)設(shè)置必要的頭域和響應(yīng)消息主體的輸出。同時(shí)更重要的是響應(yīng)模塊中應(yīng)加入用于會(huì)話跟蹤的SessionId,這部分工作也應(yīng)由MyServer服務(wù)器來(lái)預(yù)處理。為此,我們就要新建一個(gè)繼承java.io.BufferedOutputStream的輸出流ServletOutputstream,它的構(gòu)造方法中有一參數(shù)是由socket.getOutputStream()獲得的輸出流,改寫此類的write()方法。這樣在改寫后的write方法中就可作判斷,如果是第一次調(diào)用write方法時(shí),則要往輸出流中添加響應(yīng)狀態(tài)行和響應(yīng)頭域,同時(shí)把當(dāng)前請(qǐng)求所對(duì)應(yīng)的會(huì)話編號(hào)SessionId寫入響應(yīng)頭域的Set-Cookie中,以便進(jìn)行會(huì)話跟蹤。

        3.5動(dòng)態(tài)模塊的實(shí)現(xiàn)

        動(dòng)態(tài)模塊主要是提供支持動(dòng)態(tài)網(wǎng)頁(yè)的服務(wù),支持程序員級(jí)別的二次開發(fā)。為此,定義了一個(gè)簡(jiǎn)潔的MyServlet接口:

        public interface MyServlet{

        void doGet(MyRequest req,MyResponse res) throws IOException;

        void doPost(MyRequest req,MyResponse res) throws IOException;

        }

        同時(shí),引入了類MySession用來(lái)存放與某次會(huì)話相關(guān)的數(shù)據(jù),其內(nèi)部也是采用哈希表的形式來(lái)存放相關(guān)的有序?qū)?,并提供了一組同步的方法用來(lái)存取內(nèi)置哈希表中的數(shù)據(jù)。

        4基于MyServer服務(wù)器的二次開發(fā)

        在自定義的MyServer服務(wù)器上,通過實(shí)驗(yàn),它能很好地支持包含音頻、視頻和圖片的靜態(tài)網(wǎng)頁(yè)的服務(wù)。同時(shí)為了進(jìn)一步檢測(cè)其性能,在MyServer服務(wù)器通過MyServlet組件進(jìn)行了上傳文件的二次開發(fā)。因?yàn)樵谠O(shè)計(jì)與實(shí)現(xiàn)MyServer時(shí)力求使其API成為Servlet規(guī)范的子集,所以服務(wù)器端處理瀏覽器文件上傳的測(cè)試程序從MyServer服務(wù)器移植到Tomcat服務(wù)器上基本不用作改動(dòng),這也為在我們教學(xué)上從MyServer源代碼的分析過渡到JSP/Servlet的可行性提供了有力佐證。下表是用測(cè)試程序分別在MyServer服務(wù)器和Tomcat服務(wù)器上接收瀏覽器上傳文件所需時(shí)間的統(tǒng)計(jì)數(shù)據(jù)(為本機(jī)上五次實(shí)驗(yàn)的平均值):

        文件大小 MyServerTomcat

        50MB25.3秒24.9秒

        5結(jié)束語(yǔ)

        本文設(shè)計(jì)并用Java實(shí)現(xiàn)了一個(gè)面向教學(xué)的Web服務(wù)器MyServer,實(shí)現(xiàn)了多線程的響應(yīng)機(jī)制,支持會(huì)話跟蹤,提供了用于程序員級(jí)別二次開發(fā)的組件MyServlet,給出了用此組件在MyServer服務(wù)器上進(jìn)行二次開發(fā)的一個(gè)例子(文件上傳)。根據(jù)教學(xué)與實(shí)驗(yàn)的特殊要求,對(duì)各個(gè)功能模塊進(jìn)行了較好劃分,并把它用到了互聯(lián)網(wǎng)應(yīng)用開發(fā)的教學(xué)與實(shí)驗(yàn)中。MyServer服務(wù)器的目標(biāo)并不是希望與現(xiàn)有的主流Web服務(wù)器搶奪商用市場(chǎng),而是希望由此服務(wù)器的設(shè)計(jì)與實(shí)現(xiàn)來(lái)改變傳統(tǒng)的互聯(lián)網(wǎng)應(yīng)用開發(fā)的教學(xué)與實(shí)驗(yàn)?zāi)J?,希望借由Web服務(wù)器源碼的分析來(lái)讓學(xué)生理解各個(gè)抽象概念背后的實(shí)現(xiàn)機(jī)理,進(jìn)而提高教學(xué)與實(shí)驗(yàn)的效果。同時(shí)鼓勵(lì)學(xué)生組成團(tuán)隊(duì),通過合作來(lái)實(shí)現(xiàn)對(duì)現(xiàn)有的MyServer服務(wù)器的改進(jìn),達(dá)到在實(shí)驗(yàn)中潛移默化地培養(yǎng)其團(tuán)隊(duì)合作精神的目的。傳統(tǒng)的教學(xué)與實(shí)驗(yàn)方式容易使學(xué)生迷失于JSP/Servlet相對(duì)龐大的API中,忽視了對(duì)幕后機(jī)理的思考;而在教學(xué)與實(shí)驗(yàn)中結(jié)合MyServer服務(wù)器源碼的分析,就能起到舉一反三,達(dá)到授人以漁的目的,真正改變傳統(tǒng)的填鴨式的喂魚方式。

        Design and Implemention of a teaching-oriented web server

        Zou Changwei

        (College of Software Engineering,F(xiàn)ujian Normal University,F(xiàn)uzhou,350007,China)

        Abstract:A teaching-oriented Web Server which supportsprogrammer-level secondary dynamic page developing is designed and implemented.

        Keywords:Web Server ; teaching-oriented;JSP/Servlet

        參考文獻(xiàn):

        [1] Hans Bergsten著. 林琪,朱濤江 譯. JSP設(shè)計(jì)[M]. 北京:中國(guó)電力出版社,2004.

        [2] Bruce Eckel 著.侯捷 譯. Java編程思想[M]. 北京:機(jī)械工業(yè)出版社,2002.

        [3] Elliotte Rusty Harold著. 朱濤江,林劍 譯. Java網(wǎng)絡(luò)編程[M]. 北京:中國(guó)電力出版社,2005.

        收稿日期:2007-07-22

        作者簡(jiǎn)介:鄒昌偉(1981 - ),男,福建龍巖人,碩士,助教,研究方向?yàn)閃eb。

        国产综合在线观看| 亚洲国产综合精品一区| 久久亚洲中文字幕精品熟| 精品国产青草久久久久福利| 久久天天躁狠狠躁夜夜96流白浆| 国产免费无码9191精品| 成年人视频在线观看麻豆| 久久精品国产亚洲av无码偷窥| 亚洲国产一区二区三区| 国产边摸边吃奶叫床视频| 亚洲饱满人妻视频| 强d乱码中文字幕熟女1000部| 日本午夜伦理享色视频| 国产精品日日做人人爱| 丰满人妻av无码一区二区三区| 国产情侣一区在线| 国产我不卡在线观看免费| 97人伦影院a级毛片| 国产97色在线 | 日韩| 国产成人亚洲综合无码DVD| 高清国产精品一区二区| 在线播放国产自拍av| 女女女女女裸体处开bbb| 日韩亚洲欧美中文高清在线| 黑人一区二区三区啪啪网站| 亚洲一区二区三区蜜桃| 无码吃奶揉捏奶头高潮视频| 国产激情在观看| 国产亚洲日本精品二区| 亚洲av无码一区二区三区网址| 一群黑人大战亚裔女在线播放| 国产三级国产精品三级在专区| 人妻少妇久久中中文字幕| 国产办公室沙发系列高清| 97精品国产91久久久久久久| 日本女同视频一区二区三区| 国产七十六+老熟妇| 国产一区二区三区在线观看精品| 国产偷拍盗摄一区二区| 狠狠躁夜夜躁人人爽超碰97香蕉| 国产av麻豆mag剧集|