用JDBC开发基于客户/服务器模式的Internet/Intranet数据库软件
源代码在线查看: jdbcinternetintranet2.txt
四、程序实现
本套示例程序采用客户/服务器的模式,因此存在客户端与服务器端两套程序。下面分别介绍两套程序的实现方法和程序片断,完整程序将在后面附上。
(1) 服(2) 务器端程序
作为服务器端的程序,本示例才用JAVA的Application方式来编程,生成一个应用程序,可直接在JAVA的解释环境下运行。这个服务端程序的功能是监听服务器的某一个端口,当有客户程序进行连接时分配一个单独的线程为该客户服务,接受客户端的SQL查询,然后连接到服务器的数据库,把查询后的结果以数据流的方式返回给客户端。当客户端断开连接后,终止该线程,收回分配给该客户的资源。本程序的界面比较简单,由两个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的数据库表,当程序启动后,用户可以在Text1框中输入一条SQL查询语句,键入一条SQL语句即可,示例语句为select busline,stindex,stname from stname where busline like '2' order by stindexQuery按钮即可显示查询结果,可以用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斀