帝国软件
  设为首页 加入收藏 关于我们
 
解密帝国网站管理系统
栏 目:
 
您的位置:首页 > 技术文档 > JAVA编程
用JDBC开发基于客户/服务器模式的Internet/
作者:未知 发布时间:2005-03-12 来源:JSP天空网
1、概述

随着Internet/Intranet的普及以及WEB技术的发展,人们对信息的需求越来越强烈,数据库与Internet/Intranet应用软件的集成已经成为了非常迫切的问题。互联网上数据库产品的复杂,有限的带宽,以及互联网上软件产品的跨平台性,将是我们遇到的最大困难。本文通过作者的工作实践,介绍了JDBC规范及应用JAVA的SOCKET机制,以及JAVA的客户/服务器计算模式,最后根据以上的原理,实现了一个简单的基于客户/服务器的JAVA查询远端服务器上的数据库的小例子。

2、问题提出

当我从事Internet/Intranet软件开发时,为了达到很好的兼容性,安全性以及跨平台性,不得不采用JAVA编程,但是JAVA数据库方面的不足,确实众所周知。虽然JDBC技术在一段时间以前就已经发布了,但是对于大多数数据库产品而言,却要为其编制特殊的驱动。虽然有一些数据库厂商用JAVA编写了自己产品的驱动(如IBM的DB2数据库软件),但是这类产品的价格和复杂的使用方法却是使一些中小企业和Internet爱好者们望而却步,另外,在有限的带宽下如何减少数据的流量等一系列问题,将是解决这类问题的最大的绊脚石。因此,我们必须解决这类问题,并且产生一个跨平台性的,能挂接多种数据库的,基于客户/服务器的软件解决方案。

3、分析问题

 

以上的问题我们可以用JAVA的Socket机制实现客户/服务器,然后在服务器端用JDBC来完成客户端所提交的查询要求,因此,将问题分为如下两个方面。

(1)JAVA中的Socket机制

 

在各种网络的客户/服务器应用中,客户与服务器之间的通讯机制是多种多样的,但大多数都采用的是基于TCP/IP的Socket机制来完成的,Socket是两个程序间用来进行双向传输的网络通讯端点,在服务器程序方面通过IP在网络中标识自己,然后,通过一个客户端程序知道的端口号来提供服务,而客户端在网络中通过服务器的IP来找到服务器,通过连接他的端口号来获得服务器的某项服务。当然,计算机也拥有一些内置的用来提供其他服务的端口和空闲的端口,这样这些空闲端口就可供程序员来使用。由于Socket通讯机制是一种较为底层的通讯机制,所以通过Socket的数据表示是一种原始的字节流信息。那么客户端 服务器的程序就应该按照程序员制定的一种约定来进行数据的格式化处理后才能进行具体的应用,这种约定实际上就是一种协议。

Socket通讯机制提供了两种通讯方式,一种是有连接的,另一种是无连接的。有连接的方式是指程序在开始时,双方就建立了连接,形成了一条通讯链路,这条通讯链路一直存在,直到任意一方终止连接为止。在连接的同时,双方就通过这个通讯链路进行I/O操作,这种方式是可靠的而且是全双工的。无连接的方式是指提供不可靠的连接,数据传送时是以数据报的方式发送,类似与我们的寄信。本文采用的为有连接方式。

JAVA在现实中有两个类用于Socket连接,一个是ServerSocket类,应用于服务器方;一个是Socket,应用于客户方。在服务器端用如下语句对端口进行初始化及监听:

try{

ServerSocket server=new ServerSocket(9001);//监听9001端口,此端口不能与系统的

//端口号冲突

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类的线程号。

经过以上的语句后,客户端与服务器端之间就建立了联系,而且实现了多线程。

 

(2)JDBC浅析。

随着JAVA的兴起,JAVA的子公司JAVASOFT为了实现JAVA存取数据库而提供了一套数据库连接规范JDBC(JAVA DATABASE CONNECTIVITY)有一些数据库厂商根据这个数据库规范开发了自己的数据库JAVA的API,但这些在价格和使用的复杂度方面往往让人难以接受。另外,由于这些API增加了很多功能,是基于浏览器的JAVA APPLET加载的速度变慢而且影响了速度。而本程序是为一定需要而设计的故代码很小,执行速度相对加快。

JAVA为了实现数据库的连接而推出了JDBC规范,JDBC设计是基于X/OPEN SQL CLI(CALL LEVEL INTERFACE)这一模型,定义了一组API对象和方法,程序员可以使用这些API与数据库程序进行交互。JDBC API是一个应用于数据库的接口,用来解释和执行来自应用程序中的SQL语句,并返回结果集。它可以全部用JAVA写作为APPLET的一部份下载,又可以是一种本地模块与现有的数据库连接。如SUN和INTERSOLV合作开发的JDBC-ODBCBRIDGE就是一种通过JDBC来访问机器上的已定义的ODBC数据源,JDBC-ODBCBRIDEG可以通过在JDBC和ODBC之间建立一个桥梁,让JAVA程序通过JDBC来访问ODBC中的数据源。其结构如图3-2:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

在JDK1.1.5以上的版本中已经包含了JDBC-ODBCBRIDGE,读者如没有也可从SUN的网站上下载。在我们的程序中即是采用了这一种方式来实现对各种ODBC数据源的访问的。下面我们简要的介绍一些本套程序要用到的一些基本的类,读者如想获得更多的帮助可以察看SUN JDBC的帮助文档。

DriverManager类用于处理驱动程序的装入。使用该类来定义一些程序中使用的所要连接的驱动,在本程序中就是JDBC-ODBCGRIDGE;

Connection类定义了一个到特定数据库的连接。当程序定义了驱动以后,就要与数据库建立连接,该类将完成这些工作;

Statement类提供了一个执行SQL语句的容器。用来提交一个SQL查询;

ResultSet类用于控制结果类的存取。其作用是获得查询结果的一些信息,如结果的纪录数,字段数,字段名,结果集等与结果相关的信息。

(注意!由于本程序意在介绍编程方法和思想,所以JDBC的一些具体类的使用方法不属于本文的范畴。有关其中具体的使用方法将会在后面程序中写出。)

四、程序实现

本套示例程序采用客户/服务器的模式,因此存在客户端与服务器端两套程序。下面分别介绍两套程序的实现方法和程序片断,完整程序将在后面附上。

(1) 服(2) 务器端程序

作为服务器端的程序,本示例才用JAVA的Application方式来编程,生成一个应用程序,可直接在JAVA的解释环境下运行。这个服务端程序的功能是监听服务器的某一个端口,当有客户程序进行连接时分配一个单独的线程为该客户服务,接受客户端的SQL查询,然后连接到服务器的数据库,把查询后的结果以数据流的方式返回给客户端。当客户端断开连接后,终止该线程,收回分配给该客户的资源。本程序的界面比较简单如图4-1所示,由两个Label框来显示一些信息。Label1用来显示服务器程序监听的端口号。Label2用来显示当有客户程序连接似的客户的连接数目,当客户端提交申请时,Label2还显示客户的查询的SQL语句及查询结果,该Label框是被每一个线程公用的,所以当有很多客户连接时,是很繁忙的。Button1按钮的作用是结束该服务器程序。

 

 

 

该客户程序由两部分组成:一个为应用程序的主类Server类,另一个为线程类ServerThread类。下面我们将分别介绍这两个类。

Server类:该类是由Frame类派生而来。

Server(String title):该函数为Server类的构造函数,主要用来进行程序的一些初始化工作。它调用AddComponent()函数来生成程序的界面。

AddComponent():该成员函数用来生成程序的界面,主要是在Frame中添加了四个Label框和一个Button按钮以及处理按钮的点击事件。

StartListen():该成员函数用来当程序启动时监听9001端口(注:该端口可由用户自己定义一个,但不要与系统冲突),然后启动一个无限循环来监听客户的连接,当有客户连接时生成一个线程为该客户服务。

Main():该成员函数是JAVA Application的程序入口。

 

ServerThread类:该类是由Thread类派生而来,主要功能为接受用户要求,查询数据库,以及返回查询结果。由如下成员函数组成:

ServerThread(Label lab,int i,Socket s):该函数为ServerThread类的构造函数,主要功能为初始化该类。lab参数为一个Label类,用来显示一些系统信息;i参数为线程的序列号,由Server类的StartListen成员函数给出;s参数为传递的Socket类用来与连接的客户端进行连接。

InitJdbc(String str):该成员函数通过传递的SQL语句来建立一个JDBC连接,进行查询功能,并返回结果至JDBC的结果集中。str参数为一个SQL的查询语句。

DelJdbc(String str):该成员函数实现方法与InitJdbc函数相同,只不过是进行删除的操作。该函数在本例中并没有使用,有兴趣的读者可自己用一下。str参数为一个SQL的删除语句。

CloseJdbc():该成员函数为关闭一个JDBC的连接。

run():该成员函数是线程类的启动函数,是本例的核心函数。当线程启动后,首先用ServerThread构造函数传递的Socket类参数来生成in和out输入输出流,然后用一个无限的while循环来进行数据的接受,处理,编码和发送工作。具体实现在程序中。

(3) 客户端程序

由于本示例的客户端程序是运行与浏览器的,所以采用JAVA的APPLET方式编程。程序启动后

自动连接至程序中定义的主机地址199.10.10.10(注 该地址可由用户自己确定但必须在网络属性中定义)本示例的测试功能是进行网上公交线路的查询,测试数据库为名为Stname.dbf的Foxpro5.0的数据库表,当程序启动后显示如图4-2(a)所示的界面,用户可以在Text1框中输入一条SQL查询语句,键入一条SQL语句即可,示例语句为?/FONT>select busline,stindex,stname from stname where busline like ´2´ order by stindex??慊?/FONT>Query按钮即可显示查询结果,显示结果如图4-2(b),可以用prev和next按钮进行上一页和下一页的翻页。该客户程序由两个类构成:一个为程序的主类Applet1;另一个为接受线程类Receiver类。下面将分别介绍:

Apple1类:该类为主类,所以由Apple类派生而来。主要功能进行界面的生成及程序的初始化。

 

ReceiverThread类:该类是客户端程序的核心,由Thread类派生而来。该类的功能主要为查询的递交,结果的接受和解码。

Receiver(Label Lline,int alen,String hostname):该函数为该类的构造函数,主要用来进行一些初始化工作。Lline参数为Label类,用来显示一些系统信息;alen参数为得到数据的最大行数(注 本例中由于是测试故采用的是200行,用户可根据需要来更改);hostname参数为服务器的IP地址(此例为199.10.10.10,用户可根据需要更改)。

run():该成员函数为线程的运行函数,用来对服务器传递过来的数据进行接受和解码。

ExcuQuery(String q):该成员函数用来向服务器递交一条SQL查询语句。

boolean GetFindOver():该成员函数返回是否查询完毕。

boolean GetFind():该成员函数返回是否找到了数据。

int GetRecordNum():该成员函数返回查询结果的总共的记录号。

int GetFieldNum():该成员函数返回字段的数目。

String [ ][ ]GetData():该成员函数以二维数组的方式返回查询结果的数据。

 

以上为客户端和服务器端程序的介绍,读者可在后面的程序中结合实际进行理解。

五、调试方法

本程序是基于Internet/Intranet的客户服务器软件,因此最好要有一个基于TCP/IP的网络环境。服务器上要有Windows NT,IIS服务器程序或者WebSite等WWW服务器软件,并且把客户端程序放在可以通过HTTP方式访问的目录下;JAVA的运行环境,最好是安装JDK1.1.5以上的版本;ODBC驱动,本例使用的是FOXPRO 5.0的数据库Stname.dbf(这个数据库将随主文件一起),所以要安装FOXPRO 5.0的ODBC驱动,并且要在ODBC的?isual FoxPro Tables??凶⒉帷W⒉岱椒ㄈ缦拢嚎??/FONT>->设置->控制面板->32为ODBC->用户DSN->Visual Foxpro Tables->配置->Database type为Free Table directory->path为Stname.dbf所在的目录定位;在网络属性中标示自己的IP地址为199.10.10.10(注意!由于示例程序初始化时为199.10.10.10,所以要如此,用户也可根据自己的需要来修改客户端程序?/FONT>hostname?纳柚茫??匦胍?匦卤嘁肟突Ф顺绦颍?辉谂??砦募?幸?性诵?/FONT>JAVA程序的类路径的设置,可添加如下语句在批处理文件中:

 

SET PATH=C:JAVA安装的路径JAVABIN;后面可加以前的设置

SET CLASSPATH=C: JAVA安装的路径libclasses.zip;C:服务器程序的路径;

完成以上设置后即可键入如下语句激活服务器端程序了:

java Server回车

客户端要安装IE4.0的浏览器;正确设置网络参数即可。当客户机正确连接到网络后,在浏览器上向服务器申请这个客户端的JAVA APPLET即可出现图4-2的客户程序的界面。在文本本框中键入查询语句,本例中给大家一个SQL语句?/FONT>select busline,stindex,stname from stname where busline like ´2´ order by stindex??缓蟮慊?/FONT>Query按钮即可实现查询。另外,需要特别说明一下,由于本程序仅为示例程序,故结果仅限制为200条数据,当然这个数可在程序中进行修改。

 

以上为本示例程序的完全介绍,随后附上客户端和服务器端的源程序。本程序在PII233,32M,WIN95,WEBSITE,JDK1.1.6环境下调试通过。
  
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
 ·如何用JDBC实现通过APPLET连mssq  (2005-03-12)

   栏目导行
  PHP编程
  ASP编程
  ASP.NET编程
  JAVA编程
   站点最新
·致合作伙伴的欢迎信
·媒体报道
·帝国软件合作伙伴计划协议
·DiscuzX2.5会员整合通行证发布
·帝国CMS 7.0版本功能建议收集
·帝国网站管理系统2012年授权购买说
·PHPWind8.7会员整合通行证发布
·[官方插件]帝国CMS-访问统计插件
·[官方插件]帝国CMS-sitemap插件
·[官方插件]帝国CMS内容页评论AJAX分
   类别最新
·谈谈JDBC
·JDBC专题介绍
·JDBC接口技术
·利用weblogic的POOL(连接池)连接
·Jsp中调用Oracle存储过程的小例子
·JSP数据库操作例程
·JSP数据库连接大全
·用连接池提高Servlet访问数据库的效
·一种简单JDBC连接池的实现
·数据库连接池Java实现小结
 
关于帝国 | 广告服务 | 联系我们 | 程序开发 | 网站地图 | 留言板 帝国网站管理系统