?? jdbcinternetintranet2.txt
字號:
四、程序?qū)崿F(xiàn)
本套示例程序采用客戶/服務(wù)器的模式,因此存在客戶端與服務(wù)器端兩套程序。下面分別介紹兩套程序的實現(xiàn)方法和程序片斷,完整程序?qū)⒃诤竺娓缴稀?
(1) 服(2) 務(wù)器端程序
作為服務(wù)器端的程序,本示例才用JAVA的Application方式來編程,生成一個應(yīng)用程序,可直接在JAVA的解釋環(huán)境下運行。這個服務(wù)端程序的功能是監(jiān)聽服務(wù)器的某一個端口,當(dāng)有客戶程序進行連接時分配一個單獨的線程為該客戶服務(wù),接受客戶端的SQL查詢,然后連接到服務(wù)器的數(shù)據(jù)庫,把查詢后的結(jié)果以數(shù)據(jù)流的方式返回給客戶端。當(dāng)客戶端斷開連接后,終止該線程,收回分配給該客戶的資源。本程序的界面比較簡單,由兩個Label框來顯示一些信息。Label1用來顯示服務(wù)器程序監(jiān)聽的端口號。Label2用來顯示當(dāng)有客戶程序連接似的客戶的連接數(shù)目,當(dāng)客戶端提交申請時,Label2還顯示客戶的查詢的SQL語句及查詢結(jié)果,該Label框是被每一個線程公用的,所以當(dāng)有很多客戶連接時,是很繁忙的。Button1按鈕的作用是結(jié)束該服務(wù)器程序。
該客戶程序由兩部分組成:一個為應(yīng)用程序的主類Server類,另一個為線程類ServerThread類。下面我們將分別介紹這兩個類。
Server類:該類是由Frame類派生而來。
Server(String title):該函數(shù)為Server類的構(gòu)造函數(shù),主要用來進行程序的一些初始化工作。它調(diào)用AddComponent()函數(shù)來生成程序的界面。
AddComponent():該成員函數(shù)用來生成程序的界面,主要是在Frame中添加了四個Label框和一個Button按鈕以及處理按鈕的點擊事件。
StartListen():該成員函數(shù)用來當(dāng)程序啟動時監(jiān)聽9001端口(注:該端口可由用戶自己定義一個,但不要與系統(tǒng)沖突),然后啟動一個無限循環(huán)來監(jiān)聽客戶的連接,當(dāng)有客戶連接時生成一個線程為該客戶服務(wù)。
Main():該成員函數(shù)是JAVA Application的程序入口。
ServerThread類:該類是由Thread類派生而來,主要功能為接受用戶要求,查詢數(shù)據(jù)庫,以及返回查詢結(jié)果。由如下成員函數(shù)組成:
ServerThread(Label lab,int i,Socket s):該函數(shù)為ServerThread類的構(gòu)造函數(shù),主要功能為初始化該類。lab參數(shù)為一個Label類,用來顯示一些系統(tǒng)信息;i參數(shù)為線程的序列號,由Server類的StartListen成員函數(shù)給出;s參數(shù)為傳遞的Socket類用來與連接的客戶端進行連接。
InitJdbc(String str):該成員函數(shù)通過傳遞的SQL語句來建立一個JDBC連接,進行查詢功能,并返回結(jié)果至JDBC的結(jié)果集中。str參數(shù)為一個SQL的查詢語句。
DelJdbc(String str):該成員函數(shù)實現(xiàn)方法與InitJdbc函數(shù)相同,只不過是進行刪除的操作。該函數(shù)在本例中并沒有使用,有興趣的讀者可自己用一下。str參數(shù)為一個SQL的刪除語句。
CloseJdbc():該成員函數(shù)為關(guān)閉一個JDBC的連接。
run():該成員函數(shù)是線程類的啟動函數(shù),是本例的核心函數(shù)。當(dāng)線程啟動后,首先用ServerThread構(gòu)造函數(shù)傳遞的Socket類參數(shù)來生成in和out輸入輸出流,然后用一個無限的while循環(huán)來進行數(shù)據(jù)的接受,處理,編碼和發(fā)送工作。具體實現(xiàn)在程序中。
(3) 客戶端程序
由于本示例的客戶端程序是運行與瀏覽器的,所以采用JAVA的APPLET方式編程。程序啟動后
自動連接至程序中定義的主機地址199.10.10.10(注 該地址可由用戶自己確定但必須在網(wǎng)絡(luò)屬性中定義)本示例的測試功能是進行網(wǎng)上公交線路的查詢,測試數(shù)據(jù)庫為名為Stname.dbf的Foxpro5.0的數(shù)據(jù)庫表,當(dāng)程序啟動后,用戶可以在Text1框中輸入一條SQL查詢語句,鍵入一條SQL語句即可,示例語句為<FONT>select busline,stindex,stname from stname where busline like '2' order by stindex</FONT>Query按鈕即可顯示查詢結(jié)果,可以用prev和next按鈕進行上一頁和下一頁的翻頁。該客戶程序由兩個類構(gòu)成:一個為程序的主類Applet1;另一個為接受線程類Receiver類。下面將分別介紹:
Apple1類:該類為主類,所以由Apple類派生而來。主要功能進行界面的生成及程序的初始化。
ReceiverThread類:該類是客戶端程序的核心,由Thread類派生而來。該類的功能主要為查詢的遞交,結(jié)果的接受和解碼。
Receiver(Label Lline,int alen,String hostname):該函數(shù)為該類的構(gòu)造函數(shù),主要用來進行一些初始化工作。Lline參數(shù)為Label類,用來顯示一些系統(tǒng)信息;alen參數(shù)為得到數(shù)據(jù)的最大行數(shù)(注 本例中由于是測試故采用的是200行,用戶可根據(jù)需要來更改);hostname參數(shù)為服務(wù)器的IP地址(此例為199.10.10.10,用戶可根據(jù)需要更改)。
run():該成員函數(shù)為線程的運行函數(shù),用來對服務(wù)器傳遞過來的數(shù)據(jù)進行接受和解碼。
ExcuQuery(String q):該成員函數(shù)用來向服務(wù)器遞交一條SQL查詢語句。
boolean GetFindOver():該成員函數(shù)返回是否查詢完畢。
boolean GetFind():該成員函數(shù)返回是否找到了數(shù)據(jù)。
int GetRecordNum():該成員函數(shù)返回查詢結(jié)果的總共的記錄號。
int GetFieldNum():該成員函數(shù)返回字段的數(shù)目。
String [ ][ ]GetData():該成員函數(shù)以二維數(shù)組的方式返回查詢結(jié)果的數(shù)據(jù)。
以上為客戶端和服務(wù)器端程序的介紹,讀者可在后面的程序中結(jié)合實際進行理解。
五、調(diào)試方法
本程序是基于Internet/Intranet的客戶服務(wù)器軟件,因此最好要有一個基于TCP/IP的網(wǎng)絡(luò)環(huán)境。服務(wù)器上要有Windows NT,IIS服務(wù)器程序或者WebSite等WWW服務(wù)器軟件,并且把客戶端程序放在可以通過HTTP方式訪問的目錄下;JAVA的運行環(huán)境,最好是安裝JDK1.1.5以上的版本;ODBC驅(qū)動,本例使用的是FOXPRO 5.0的數(shù)據(jù)庫Stname.dbf(這個數(shù)據(jù)庫將隨主文件一起),所以要安裝FOXPRO 5.0的ODBC驅(qū)動,并且要在ODBC的揤isual FoxPro Tables斀
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -