国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

用JDBC開發(fā)基于客戶/服務器模式的Internet/Intranet數(shù)

2019-11-18 12:40:12
字體:
來源:轉載
供稿:網友

  1、概述
  
  隨著Internet/Intranet的普及以及WEB技術的發(fā)展,人們對信息的需求越來越強烈,數(shù)據(jù)庫與Internet/Intranet應用軟件的集成已經成為了非常迫切的問題。互聯(lián)網上數(shù)據(jù)庫產品的復雜,有限的帶寬,以及互聯(lián)網上軟件產品的跨平臺性,將是我們碰到的最大困難。本文通過作者的工作實踐,介紹了JDBC規(guī)范及應用java的SOCKET機制,以及JAVA的客戶/服務器計算模式,最后根據(jù)以上的原理,實現(xiàn)了一個簡單的基于客戶/服務器的JAVA查詢遠端服務器上的數(shù)據(jù)庫的小例子。
  
  2、問題提出
  
  當我從事Internet/Intranet軟件開發(fā)時,為了達到很好的兼容性,安全性以及跨平臺性,不得不采用JAVA編程,但是JAVA數(shù)據(jù)庫方面的不足,確實眾所周知。雖然JDBC技術在一段時間以前就已經發(fā)布了,但是對于大多數(shù)數(shù)據(jù)庫產品而言,卻要為其編制非凡的驅動。雖然有一些數(shù)據(jù)庫廠商用JAVA編寫了自己產品的驅動(如IBM的DB2數(shù)據(jù)庫軟件),但是這類產品的價格和復雜的使用方法卻是使一些中小企業(yè)和Internet愛好者們望而卻步,另外,在有限的帶寬下如何減少數(shù)據(jù)的流量等一系列問題,將是解決這類問題的最大的絆腳石。因此,我們必須解決這類問題,并且產生一個跨平臺性的,能掛接多種數(shù)據(jù)庫的,基于客戶/服務器的軟件解決方案。
  
  3、分析問題
  
   
  
  以上的問題我們可以用JAVA的Socket機制實現(xiàn)客戶/服務器,然后在服務器端用JDBC來完成客戶端所提交的查詢要求,因此,將問題分為如下兩個方面。
  
  (1)JAVA中的Socket機制
  
   
  
  在各種網絡的客戶/服務器應用中,客戶與服務器之間的通訊機制是多種多樣的,但大多數(shù)都采用的是基于TCP/ip的Socket機制來完成的,Socket是兩個程序間用來進行雙向傳輸?shù)木W絡通訊端點,在服務器程序方面通過IP在網絡中標識自己,然后,通過一個客戶端程序知道的端口號來提供服務,而客戶端在網絡中通過服務器的IP來找到服務器,通過連接他的端口號來獲得服務器的某項服務。當然,計算機也擁有一些內置的用來提供其他服務的端口和空閑的端口,這樣這些空閑端口就可供程序員來使用。由于Socket通訊機制是一種較為底層的通訊機制,所以通過Socket的數(shù)據(jù)表示是一種原始的字節(jié)流信息。那么客戶端 服務器的程序就應該按照程序員制定的一種約定來進行數(shù)據(jù)的格式化處理后才能進行具體的應用,這種約定實際上就是一種協(xié)議。
  
  Socket通訊機制提供了兩種通訊方式,一種是有連接的,另一種是無連接的。有連接的方式是指程序在開始時,雙方就建立了連接,形成了一條通訊鏈路,這條通訊鏈路一直存在,直到任意一方終止連接為止。在連接的同時,雙方就通過這個通訊鏈路進行I/O操作,這種方式是可靠的而且是全雙工的。無連接的方式是指提供不可靠的連接,數(shù)據(jù)傳送時是以數(shù)據(jù)報的方式發(fā)送,類似與我們的寄信。本文采用的為有連接方式。
  
  JAVA在現(xiàn)實中有兩個類用于Socket連接,一個是ServerSocket類,應用于服務器方;一個是Socket,應用于客戶方。在服務器端用如下語句對端口進行初始化及監(jiān)聽:
  
  try{
  
  ServerSocket server=new ServerSocket(9001);//監(jiān)聽9001端口,此端口不能與系統(tǒng)的
  
  //端口號沖突
  
  Socket socket=server.accept();//阻塞進程,一旦有客戶連接初始化socket類
  
  DataInputStream in=new DataInputStream(socket.getInputStream()); //建立輸入流
  
  PRintStream out=new PrintStream(socket.getOutputStream()); //建立輸出流
  
  }catch(IOException e){}
  
  在客戶端用如下語句即可與服務器連接:
  
  try{
  
  socket=new Socket(hostname,9001);//連接以hostname的服務器,端口號為9001
  
  //這里的hostname為服務器的IP地址
  
  in=new DataInputStream(socket.getInputStream());//初始化輸入流
  
  out=new PrintStream(socket.getOutputStream());//定義輸出流
  
  }catch(IOException e){}
  
  通過以上語句后,在客戶與服務器之間就建立了in和out這兩個輸入和輸出流,那么就可以進行通信了。最后,為了在服務器端能響應多個客戶端的請求,在服務器的輸入和輸出流的處理中應用了多線程,是每一個線程對應一個客戶端的服務,由于JAVA的內存治理是一種摾瘮治理,當某一個客戶的連接斷開后,服務器程序分配給這一個客戶的線程的資源就會被自動收回。其多線程的語句如下:
  
   
  
  new ServerThread(clientname,clientcount,socket).start();
  
  //初始化一個新的ServerThread類(注:ServerThread類為程序的一個線程類
  
  在以上的語句中clientcount為傳給ServerThread類的線程號。
  
  經過以上的語句后,客戶端與服務器端之間就建立了聯(lián)系,而且實現(xiàn)了多線程。
  
   
  
  (2)JDBC淺析。
  
  隨著JAVA的興起,JAVA的子公司JAVASOFT為了實現(xiàn)JAVA存取數(shù)據(jù)庫而提供了一套數(shù)據(jù)庫連接規(guī)范JDBC(JAVA DATABASE CONNECTIVITY)有一些數(shù)據(jù)庫廠商根據(jù)這個數(shù)據(jù)庫規(guī)范開發(fā)了自己的數(shù)據(jù)庫JAVA的API,但這些在價格和使用的復雜度方面往往讓人難以接受。另外,由于這些API增加了很多功能,是基于瀏覽器的JAVA APPLET加載的速度變慢而且影響了速度。而本程序是為一定需要而設計的故代碼很小,執(zhí)行速度相對加快。
  
  JAVA為了實現(xiàn)數(shù)據(jù)庫的連接而推出了JDBC規(guī)范,JDBC設計是基于X/OPEN SQL CLI(CALL LEVEL INTERFACE)這一模型,定義了一組API對象和方法,程序員可以使用這些API與數(shù)據(jù)庫程序進行交互。JDBC API是一個應用于數(shù)據(jù)庫的接口,用來解釋和執(zhí)行來自應用程序中的SQL語句,并返回結果集。它可以全部用JAVA寫作為APPLET的一部份下載,又可以是一種本地模塊與現(xiàn)有的數(shù)據(jù)庫連接。如SUN和INTERSOLV合作開發(fā)的JDBC-ODBCBRIDGE就是一種通過JDBC來訪問機器上的已定義的ODBC數(shù)據(jù)源,JDBC-ODBCBRIDEG可以通過在JDBC和ODBC之間建立一個橋梁,讓JAVA程序通過JDBC來訪問ODBC中的數(shù)據(jù)源。
  
  在JDK1.1.5以上的版本中已經包含了JDBC-ODBCBRIDGE,讀者如沒有也可從SUN的網站上下載。在我們的程序中即是采用了這一種方式來實現(xiàn)對各種ODBC數(shù)據(jù)源的訪問的。下面我們簡要的介紹一些本套程序要用到的一些基本的類,讀者如想獲得更多的幫助可以察看SUN JDBC的幫助文檔。
  
  DriverManager類用于處理驅動程序的裝入。使用該類來定義一些程序中使用的所要連接的驅動,在本程序中就是JDBC-ODBCGRIDGE;
  
  Connection類定義了一個到特定數(shù)據(jù)庫的連接。當程序定義了驅動以后,就要與數(shù)據(jù)庫建立連接,該類將完成這些工作;
  
  Statement類提供了一個執(zhí)行SQL語句的容器。用來提交一個SQL查詢;
  
  ResultSet類用于控制結果類的存取。其作用是獲得查詢結果的一些信息,如結果的紀錄數(shù),字段數(shù),字段名,結果集等與結果相關的信息。
  
  (注重!由于本程序意在介紹編程方法和思想,所以JDBC的一些具體類的使用方法不屬于本文的范疇。有關其中具體的使用方法將會在后面程序中寫出。)
  
  四、程序實現(xiàn)
  
  本套示例程序采用客戶/服務器的模式,因此存在客戶端與服務器端兩套程序。下面分別介紹兩套程序的實現(xiàn)方法和程序片斷,完整程序將在后面附上。
  
  (1) 服(2) 務器端程序
  
  作為服務器端的程序,本示例才用JAVA的application方式來編程,生成一個應用程序,可直接在JAVA的解釋環(huán)境下運行。這個服務端程序的功能是監(jiān)聽服務器的某一個端口,當有客戶程序進行連接時分配一個單獨的線程為該客戶服務,接受客戶端的SQL查詢,然后連接到服務器的數(shù)據(jù)庫,把查詢后的結果以數(shù)據(jù)流的方式返回給客戶端。當客戶端斷開連接后,終止該線程,收回分配給該客戶的資源。本程序的界面比較簡單如圖4-1所示,由兩個Label框來顯示一些信息。Label1用來顯示服務器程序監(jiān)聽的端口號。Label2用來顯示當有客戶程序連接似的客戶的連接數(shù)目,當客戶端提交申請時,Label2還顯示客戶的查詢的SQL語句及查詢結果,該Label框是被每一個線程公用的,所以當有很多客戶連接時,是很繁忙的。Button1按鈕的作用是結束該服務器程序。
  
   
  
   
  
   
  
  該客戶程序由兩部分組成:一個為應用程序的主類Server類,另一個為線程類ServerThread類。下面我們將分別介紹這兩個類。
  
  Server類:該類是由Frame類派生而來。
  
  Server(String title):該函數(shù)為Server類的構造函數(shù),主要用來進行程序的一些初始化工作。它調用AddComponent()函數(shù)來生成程序的界面。
  
  AddComponent():該成員函數(shù)用來生成程序的界面,主要是在Frame中添加了四個Label框和一個Button按鈕以及處理按鈕的點擊事件。
  
  StartListen():該成員函數(shù)用來當程序啟動時監(jiān)聽9001端口(注:該端口可由用戶自己定義一個,但不要與系統(tǒng)沖突),然后啟動一個無限循環(huán)來監(jiān)聽客戶的連接,當有客戶連接時生成一個線程為該客戶服務。
  
  Main():該成員函數(shù)是JAVA Application的程序入口。
  
   
  
  ServerThread類:該類是由Thread類派生而來,主要功能為接受用戶要求,查詢數(shù)據(jù)庫,以及返回查詢結果。由如下成員函數(shù)組成:
  
  ServerThread(Label lab,int i,Socket s):該函數(shù)為ServerThread類的構造函數(shù),主要功能為初始化該類。lab參數(shù)為一個Label類,用來顯示一些系統(tǒng)

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 宜兴市| 潞西市| 长兴县| 文化| 密云县| 永寿县| 内江市| 太保市| 南澳县| 开江县| 葵青区| 怀远县| 鄂州市| 老河口市| 三江| 巴楚县| 秦皇岛市| 德保县| 德令哈市| 元朗区| 哈尔滨市| 建始县| 高淳县| 柳江县| 南汇区| 山阳县| 武夷山市| 陈巴尔虎旗| 大名县| 桦川县| 惠来县| 凯里市| 大同县| 黎川县| 岱山县| 花莲市| 山西省| 山西省| 新平| 建昌县| 蓬莱市|