Java不走弯路教程(5.Client-Server模式(2)-Client)
5.Client-Server模式(2)-Client
在上一章,我们完成一个简单的数据库服务器,并在客户端用telnet方式成功进行通信。
本章将用Java实现客户端程序,来代替telnet。
先看代码




下面是客户端与服务器的协议:
建立连接
服务器 发送:Input your name password:
客户端 发送:用户名空格密码
服务器 发送:verify ok
客户端 发送:SQL语句
服务器 发送:查询结果
客户端 发送:exit
断开连接
这样我们模拟了一个简单的数据库服务器和客户端的交互过程。
算作我们的数据库产品,我称他为MyDB
这样提供给用户使用,很不方便,因为用户要了解我的协议,才可以使用。
而用户需要的只是数据库的地址,端口,用户名,密码。
然后发送SQL语句,返回查询结果。这些简单的需求。

注:我们抛掉了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");
代码改造成这样:

作为一个产品,我们通常提供不同版本的驱动以对应版本的升级,于是程序可能是这个样子:
package main;
public class MyClient{
public static void main(String[] args) throws Exception {
Class.forName("driver.MyDriver");
//连接到远程服务器
MyConnection1_1 conn = MyDriverManager.getConnection("myrule:mydb:127.0.0.1:8000", "root","abc");
// 获取SQL执行对象
MyStatement1_11 st = conn.createStatement();
//发送SQL语句
MyResult1_1 result = st.executeQuery("select * from person");
//输出查询结果
while(result.next()){
System.out.println(result.getString("username"));
}
//关闭连接
conn.close();
}
}
这种写法的不便之处是,产品的版本号写入了客户的代码中,这样产品升级后还需要修改客户的代码,显然是很不便的。
于是,我们可以对每个需要升级的类做一个接口,用户只需要调用接口即可:
像这样:



具体生成那个类,在具体的实现中来决定。
比如生成conn对象时时候,我们的驱动MyDriver,返回MyConnection1_1或MyConnection1_2
这样,升级驱动程序即完成了版本的升级。
本节代码可以从这里下载
https://files.cnblogs.com/files/java123vip/src01.zip
版权声明:本教程版权归java123.vip所有,禁止任何形式的转载与引用。
Java不走弯路教程(5.Client-Server模式(2)-Client)的更多相关文章
- Java不走弯路教程(4.Client-Server模式(1)-Server)
4.Client-Server模式(1)-Server 在上一章中,我们完成了MyDataBase.java的编写,类似于一个简单的数据库功能,提供了用户验证,查询操作. 在本章中,我们将继续扩展这个 ...
- Java不走弯路教程(1.环境搭建)
1.环境搭建在开始写第一个Java程序之前,我们需要做一些简单的准备工作. 1.1 还记得DOS吗 我们可以通过图形界面来操作我们的电脑.但作为程序员,你首先需要学会用命令行的方式来操作电脑,因为不是 ...
- Java不走弯路教程(前言)
本教程的程序基于Windows开发,所以你需要有一台安装Windows操作系统的电脑. 前言本教程将带你完成Java的初学和WEB框架的开发,学完本教程,你将完成对Java的入门并且对下一步不再迷茫. ...
- Java不走弯路教程(2.Hello,Java!)
2.Hello,Java! 欢迎来到Java的世界,在上一章,我们已经完成了DOS的基本操作学习和Java的环境搭建,在本章中我们Java来完成一个简单的DOS程序. 2.1 Hello,Java! ...
- Java不走弯路教程(3.用户验证与文件内容查询)
3.用户验证与文件内容查询 在上一章中,我们完成了对指定文件内容的输出操作. 我们现在有如下格式的文件product.db id,product_name,product_detail 1,noteb ...
- Java不走弯路教程(6.JDBC)
6.JDBC 在上一章,我们完成了MyDb数据库的简单的客户段调用.作为产品我们还封装了驱动程序,并且提供了统一的调用接口. 大家应该知道,市面上有多种数据库产品,比如Oracle,Mysql,DB2 ...
- Java虚拟机6:内存溢出和内存泄露、并行和并发、Minor GC和Full GC、Client模式和Server模式的区别
前言 之前的文章尤其是讲解GC的时候提到了很多的概念,比如内存溢出和内存泄露.并行与并发.Client模式和Server模式.Minor GC和Full GC,本文详细讲解下这些概念的区别. 内存溢出 ...
- java虚拟机--jvm client模式与server模式的区别
JVM Server模式与client模式启动,最主要的差别在于:-Server模式启动时,速度较慢,但是一旦运行起来后,性能将会有很大的提升.JVM如果不显式指定是-Server模式还是-clien ...
- Java虚拟机10:Client模式和Server模式的区别
部分商用虚拟机中,Java程序最初是通过解释器对.class文件进行解释执行的,当虚拟机发现某个方法或代码块运行地特别频繁的时候,就会把这些代码认定为热点代码Hot Spot Code(这也是我们使用 ...
随机推荐
- 02_c3p0之c3p0-config.xml配置案例,操作c3p0的jdbcUtil工具类的编写
c3p0也是一个开源jdbc连接池,我们熟悉的Hibernate和Spring框架使用的都是该数据源. 这里获得数据源使用的方法是:ComboPooledDataSource 它提供的构造方法有 ...
- 1079. Total Sales of Supply Chain (25) -记录层的BFS改进
题目如下: A supply chain is a network of retailers(零售商), distributors(经销商), and suppliers(供应商)-- everyon ...
- Nginx模块之SessionSticky
0 工作原理 Session Sticky 模块在upstream 返回响应后,向客户的浏览器写入 Cookie ,默认名为route ,保存的内容是一个 md5 码. 之后,模块接收到客户浏览器的请 ...
- javascript之event对象
注意:以下给出的是在IE下的event事件说明,如果应用在非IE下可能会出现兼容性问题,需要结合具体的应用环境,使用兼容性的函数来处理 1.altKey 描述: 检查alt键的状态. 语法: even ...
- UNIX网络编程——通用套接字选项
1. SO_BROADCAST 套接字选项 本选项开启或禁止进程发送广播消息的能力.只有数据报套接字支持广播,并且还必须是在支持广播消息的网络上(例如以太网,令牌环网等).我们不可能在点对点链路上进行 ...
- MyBatis进阶(一)运行原理
初次学习MyBatis,自己花了不少时间,理解一件事物是需要时间的.经过多次反复的理解,你的认知能力就可以得到提升.以下是学习MyBatis的一些理解认识,技术理解上若有不当之处,敬请朋友们提出宝贵意 ...
- x264 编码器选项分析 (x264 Codec Strong and Weak Points) 2
文章目录: x264 编码器选项分析 (x264 Codec Strong and Weak Points) 1 x264 编码器选项分析 (x264 Codec Strong and Weak Po ...
- Ajax分页 Spring MVC + Hibernate
效果图: 1. 添加公共类.方法.代码 1. 分页类:Page.java package cn.com.aperfect.sso.base.dao; import java.util.Arra ...
- Linux0.11中对文本文件进行修改的策略
现在,假设 hello.txt 是硬盘上已有的一个文件,而且内容为 "hello, world" ,在文件的当前指针设置完毕后,我们来介绍 sys_read , sys_write ...
- 【Mac】Mac OS X 安装GNU命令行工具
macos的很多用户都是做it相关的人,类unix系统带来了很多方面,尤其是经常和linux打交道的人. 但是作为经常使用linux 命令行的人发现macos中的命令行工具很多都是bsd工具,跟lin ...