java client server_Java不走弯路教程(5.Client-Server模式(2)-Client)

5.Client-Server模式(2)-Client

在上一章,我们完成一个简单的数据库服务器,并在客户端用telnet方式成功进行通信。

本章将用Java实现客户端程序,来代替telnet。

先看代码

37016b1db4d69ca75811a0f91350f66b.png

896d1b98974ffda57e050ba241089df9.png

f7fafc1d424a2ba83c99d840e7e2a12b.png

a73ea7d97c32319e7d5298ad1dae1bed.png

下面是客户端与服务器的协议:

建立连接

服务器 发送:Input your name password:

客户端 发送:用户名空格密码

服务器 发送:verify ok

客户端 发送:SQL语句

服务器 发送:查询结果

客户端 发送:exit

断开连接

这样我们模拟了一个简单的数据库服务器和客户端的交互过程。

算作我们的数据库产品,我称他为MyDB

这样提供给用户使用,很不方便,因为用户要了解我的协议,才可以使用。

而用户需要的只是数据库的地址,端口,用户名,密码。

然后发送SQL语句,返回查询结果。这些简单的需求。

2841e24dbc7f592a8b7567b309bb81b6.png

注:我们抛掉了MyUtil。

我把通讯过程封装到下面的三个类中

Driver 用于连接服务器的驱动程序,返回一个Connection对象

Connection 控制连接的建立与关闭,创建SQL语句执行对象

Statement SQL语句执行对象,发送SQL语句,返回查询结果

ResultSet 查询结果

上述类的关系可以表示如下:

Driver->产生Connection->产生Statement->产生ResultSet

Driver相当于数据库的驱动程序,按照通用的软件逻辑来看,软件使用前,需要安装驱动程序并将驱动程序注册到操作系统。这样下次就可以直接使用软件了。

所以我们需要一个安装驱动的过程。

接下来我们对这条语句进行改造:

MyConnection conn = MyDriver.connect("127.0.0.1",8000,"root","abc");

//安装驱动程序

MyDriver myDriver = new MyDriver();

myDriver.install();

//注册驱动程序

myDriver.regist();

MyConnection conn1 = myDriver.connect("127.0.0.1",8000,"root","abc");

MyConnection conn2 = myDriver.connect("127.0.0.1",8000,"root","abc");

这样在安装并注册完驱动程序后,我们就可以从获得数据库连接开始操作数据库了。

如果conn1和conn2不在同一方法/类中,我们需要把myDriver传来到使用他的方法/类中,才能获得数据库连接。

显然这不是我们想要的。

我们需要的理想方式是,一次安装注册,到处使用。

不依赖于具体的实例的话,我们需要用静态方法来实现,因为静态方法在程序运行期间不依赖于具体的实例,

所以我们做一个MyDriverManager,把安装好的驱动程序注册到这里,然后每次从MyDriverManager中取得连接。

MyDriver myDriver = new MyDriver();

myDriver.installAndRegist();

MyConnection conn = MyDriverManager.getConnection("myrule:mydb:127.0.0.1:8000", "root","abc");

注:我们对参数进行了改造,第一个参数由规则名:数据库名:IP地址:端口号组成,这样我们将来可以支持不同的协议和数据库种类。

因为驱动也只有一份,所以,我们也不需要生成具体的实例。

MyDriver.installAndRegist();

但这样,在程序中还需要导入MyDriver的包,我们把驱动程序写道static块中,然后改成这样

Class.forName("driver.MyDriver");

代码改造成这样:

4ff74b2f3c096a9da15abd06c6898b63.png

作为一个产品,我们通常提供不同版本的驱动以对应版本的升级,于是程序可能是这个样子:

1 packagemain;2

3 public classMyClient{4

5 public static void main(String[] args) throwsException {6

7 Class.forName("driver.MyDriver");8

9 //连接到远程服务器

10 MyConnection1_1 conn = MyDriverManager.getConnection("myrule:mydb:127.0.0.1:8000", "root","abc");11

12 //获取SQL执行对象

13 MyStatement1_11 st =conn.createStatement();14

15 //发送SQL语句

16 MyResult1_1 result = st.executeQuery("select * from person");17

18 //输出查询结果

19 while(result.next()){20 System.out.println(result.getString("username"));21 }22

23 //关闭连接

24 conn.close();25 }26 }

这种写法的不便之处是,产品的版本号写入了客户的代码中,这样产品升级后还需要修改客户的代码,显然是很不便的。

于是,我们可以对每个需要升级的类做一个接口,用户只需要调用接口即可:

像这样:

7e247d4f476dc6216723af11fb9b31d2.png

0e4c083bccd1ec241e950469cf5cde46.png

bc916d30226636ed1b19edba3816defe.png

7578fdbef6d64eb0981448b15e69b510.png

具体生成那个类,在具体的实现中来决定。

比如生成conn对象时时候,我们的驱动MyDriver,返回MyConnection1_1或MyConnection1_2

这样,升级驱动程序即完成了版本的升级。

本节代码可以从这里下载

https://files.cnblogs.com/files/java123vip/src01.zip

版权声明:本教程版权归java123.vip所有,禁止任何形式的转载与引用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值