摘 要:針對多種圖書查詢系統(tǒng)的優(yōu)缺點(diǎn),研究了面向?qū)ο蟮木W(wǎng)絡(luò)編程語言Java的網(wǎng)絡(luò)類庫文件,利用Socket套接字實(shí)現(xiàn)圖書信息查詢系統(tǒng)的設(shè)計(jì)。依據(jù)網(wǎng)絡(luò)編程方法和數(shù)據(jù)庫特性,給出了實(shí)現(xiàn)圖書信息查詢系統(tǒng)的方法,設(shè)計(jì)過程中的關(guān)鍵技術(shù)和開發(fā)中需要注意的問題,以及數(shù)據(jù)庫的驅(qū)動和連接方法。最后給出服務(wù)器端和客戶端核心代碼作為參考。與其他查詢系統(tǒng)比較,該系統(tǒng)更加方便和快捷。
關(guān)鍵詞:Socket; 數(shù)據(jù)庫; Java; 查詢
中圖分類號:TP311 文獻(xiàn)標(biāo)識碼:A
文章編號:1004-373X(2010)11-0138-03
Design and Implementation of Books Inquiry System Based on Java
TIAN Xu-an1, SU Lin-mao1, WANG Hong-mei2
(1. Xi’an Communications Institute, Xi’an 710106, China; 2. The Second Communication Corps of the Lanzhou Military Region, Urumqi830002, China)
Abstract: The design of the books information inquiry system is realized by the Socket, according to the advantages and shortcomings existed in the various books inquiry systems, and the network library files of the object-oriegnted network programming language Java is researched.The realization of books information inquiry system, the key technique in the design process and the problems in development, the driven and joint means of database were given, according to the characteristics of the database and network programming means. It is more convenient and prompt. The core code of the server-side and client-side are showed for reference.
Keywords: Socket; database; Java; inquiry
基于Java查詢系統(tǒng)的開發(fā)目的是為了提高查詢效率。選用Java開發(fā)工具可以提高查詢系統(tǒng)的移植性和兼容性。 系統(tǒng)主要功能是實(shí)現(xiàn)讀者對圖書信息進(jìn)行準(zhǔn)確、快速查閱。
1 系統(tǒng)結(jié)構(gòu)
系統(tǒng)采取B/S結(jié)構(gòu),利用服務(wù)器端和客戶端的 Socket通信機(jī)制完成信息的傳遞,如圖1所示。數(shù)據(jù)庫用來統(tǒng)計(jì)圖書信息,主要涉及的是信息表格,選用Access實(shí)現(xiàn)。
2 Socket通信分析
2.1 Socket應(yīng)用
網(wǎng)絡(luò)通過雙向通訊連接實(shí)現(xiàn)數(shù)據(jù)交換。Socket用來實(shí)現(xiàn)客戶端和服務(wù)端的連接,它是TCP/IP協(xié)議的編程界面,由一個IP地址和一個端口號惟一確定。在Java環(huán)境下,Socket編程是基于TCP/IP協(xié)議的網(wǎng)絡(luò)編程。
2.2 Socket通信過程
服務(wù)器端Listen(監(jiān)聽)某個端口是否有連接請求,客戶端向服務(wù)器端發(fā)出Connect(連接)請求,服務(wù)器端向客戶端發(fā)回Accept(接受)消息,一個連接就建立起來了。服務(wù)器端和客戶端都可以通過Send,Write等方法與對方通信。
圖1 系統(tǒng)結(jié)構(gòu)
采用Socket套接字把網(wǎng)絡(luò)連接作為一個流(Stream),通過流讀寫字節(jié)。
2.3 網(wǎng)絡(luò)客戶和網(wǎng)絡(luò)服務(wù)器的設(shè)置
客戶端與服務(wù)器端使用約定一致的協(xié)議或標(biāo)準(zhǔn)來通信。由于在一個機(jī)器上同時運(yùn)行了多個相同的或不同的網(wǎng)絡(luò)服務(wù)器,因此,端口號可作為約定的標(biāo)準(zhǔn)或協(xié)議的一部分,以便客戶機(jī)定位服務(wù)器。
網(wǎng)絡(luò)服務(wù)器綁定在某一端口上,監(jiān)聽新的連接。服務(wù)器允許客戶端建立一個相對持久的連接,在這個鏈接的生命周期中,客戶端不斷請求服務(wù)器的服務(wù),直到客戶端顯示斷開這個連接。
3 查詢系統(tǒng)的設(shè)計(jì)方案
查詢系統(tǒng)分為服務(wù)器端和客戶機(jī)端兩部分。首先執(zhí)行服務(wù)器端程序,然后監(jiān)聽本地IP地址上指定的端口,并發(fā)生阻塞,等待客戶端程序的連接請求;接著,客戶端程序啟動,向指定的服務(wù)器發(fā)送連接請求;當(dāng)服務(wù)器端得到客戶端程序的連接請求后,與客戶端程序建立連接,并向客戶端程序返回其IP地址。
3.1 服務(wù)器端的設(shè)計(jì)步驟
(1) 創(chuàng)建一個等待連接的ServerSocket對象。
(2) 調(diào)用ServerSocket對象的accept()方法偵聽接受客戶端的連接請求。當(dāng)偵聽到一個客戶的請求時,連接成功,并返回一個Socket對象。
(3) 創(chuàng)建與Socket對象綁定的輸入輸出流,并建立相應(yīng)的數(shù)據(jù)輸入輸出流。
(4) 通過數(shù)據(jù)輸入輸出流與客戶端進(jìn)行數(shù)據(jù)讀寫,完成雙向通信。
(5) 當(dāng)客戶端斷開連接時,關(guān)閉各個流對象,結(jié)束通信。
3.2 服務(wù)器端的設(shè)計(jì)步驟
(1) 創(chuàng)建指定服務(wù)器上指定端口號的Socket對象。
(2) 創(chuàng)建與Socket對象綁定的輸入輸出流,并建立相應(yīng)的數(shù)據(jù)輸入輸出流。
(3) 通過數(shù)據(jù)輸入輸出流與服務(wù)器端進(jìn)行數(shù)據(jù)讀寫,完成雙向通信。
(4) 通過調(diào)用close()方法關(guān)閉與服務(wù)器端的連接,并關(guān)閉各個流對象,結(jié)束通信。
4 數(shù)據(jù)庫的驅(qū)動和連接
采用jdbc-odbc橋?qū)崿F(xiàn)庫的驅(qū)動和連接,完成數(shù)據(jù)庫的連接并返回該連接。如圖2所示。
4.1 建立Access數(shù)據(jù)庫
(1) 建立Access數(shù)據(jù)庫db.mdb并創(chuàng)建bookform表。
(2) 打開控制面板→管理工具→數(shù)據(jù)源(ODBC),選擇“系統(tǒng)DSN”,單擊“添加”,選擇“Driver do Microsoft Access (*.mdb)”,點(diǎn)擊“完成”,彈出的對話框里將“數(shù)據(jù)源名”一項(xiàng)給數(shù)據(jù)源取名,點(diǎn)擊“選擇”,找到剛剛建立的數(shù)據(jù)庫文件db.mdb,即ODBC數(shù)據(jù)源配置完成。
圖2 庫的驅(qū)動和連接
4.2 Access數(shù)據(jù)庫的連接
JDBC獨(dú)立于具體的關(guān)系數(shù)據(jù)庫。 JDBC API與數(shù)據(jù)庫交互并處理所得的結(jié)果,通過SQL語句或存儲在數(shù)據(jù)庫中的過程(stored procedures)來存取數(shù)據(jù)。
通過JDBC來存取某一特定的數(shù)據(jù)庫時,JDBC driver是連接JDBC API與具體數(shù)據(jù)庫之間的橋梁。Java程序首先使用JDBC API來與JDBC Driver Manager交互,由JDBC Driver Manager載入指定的JDBC drivers, 之后就可以通過JDBC API存取數(shù)據(jù)庫。使用driver需要每個客戶端機(jī)都裝上數(shù)據(jù)庫對應(yīng)的ODBC driver。
數(shù)據(jù)庫的連接過程如下所述:
首先使用Java Class類中的forName靜態(tài)方法加載驅(qū)動程序:
Class.forName(″sun.jdbc.odbc.JdbcOdbcDriver″);
然后連接數(shù)據(jù)庫,需要用java.sql包中的Connection類聲明一個對象,再用類DriverManager調(diào)用它的靜態(tài)方法getConnection創(chuàng)建這個連接;
最后創(chuàng)建Statement對象,利用Statement對象來傳送并執(zhí)行SQL命令。
5 核心代碼參考
5.1 服務(wù)器端程序
服務(wù)器端程序如下:
public static void main(String args[]) {
ServerSocket server=1;
Server_thread thread;
Socket you=1;
while(true) {
try {
server=new ServerSocket(6666);
}catch(IOException e1) {
System.out.println(″正在監(jiān)聽″); }
try {
you=server.accept(); }
catch(IOException e){}
if(you!=1) {
new Server_thread(you).start();
} else {continue;}
5.2 客戶端程序
客戶端程序如下:
try
{socket=new Socket(this.getCodeBase().getHost(),6666);
in=new DataInputStream(socket.getInputStream());
out=new DataOutputStream(socket.getOutputStream());
}
catch(IOException ee)
{提示條.setText(″連接失敗″);}
if(socket!=1)
{InetAddress address=socket.getInetAddress();
提示條.setText(″連接:″+address+″成功″);}
if(thread==1)
{thread=new Thread(this);
thread.start();
}
}
public void stop()
{try
{
socket.close();
thread=1;
}
catch(IOException e)
{this.showStatus(e.toString());
}
}
InetAddress類表示一個IP地址。得到通信對方的IP地址后,就可以用Socket或數(shù)據(jù)報(bào)方式與該主機(jī)通信。該類只有一個默認(rèn)的不帶參的構(gòu)造方法:
static InetAddress getLocalHost();
該構(gòu)造方法返回一個包含本地主機(jī)的IP地址的InetAddress對象。當(dāng)方法返回一個或多個InetAddress對象的引用時,就可以使用其他非靜態(tài)方法得到數(shù)據(jù)。
6 結(jié) 語
基于Java查詢系統(tǒng)是依據(jù)網(wǎng)絡(luò)編程方法和數(shù)據(jù)庫特性以及采用Socket套接字實(shí)現(xiàn)圖書信息查詢的一種有效方法。該系統(tǒng)與其他查詢系統(tǒng)相比較具有更加方便和快捷的優(yōu)點(diǎn),可提高查詢效率。該系統(tǒng)的不足之處是數(shù)據(jù)庫的連接和驅(qū)動相對麻煩一些。
參考文獻(xiàn)
[1]葉樹華.網(wǎng)絡(luò)編程實(shí)用教程\\.北京:人民郵電出版社,2006.
[2]張汾.圖書館圖書管理系統(tǒng)分析與設(shè)計(jì)\\.山西電子技術(shù),2002(1):22-27.
[3]譚獻(xiàn)海.網(wǎng)絡(luò)編程技術(shù)及應(yīng)用\\.北京:清華大學(xué)出版社,2006.
[4]Deitel M H.Java大學(xué)教程\\.北京:電子工業(yè)出版社,2007.
[5]應(yīng)東生.Java開發(fā)技術(shù)全程指南\\.北京:電子工業(yè)出版社,2008.
[6]杜佳榮.Java網(wǎng)絡(luò)編程技術(shù)與實(shí)踐\\.北京:清華大學(xué)出版社,2008.