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(这也是我们使用 ...
随机推荐
- 1.0、Android Studio管理你的项目
项目概览 Android Studio中的项目包含了开发一个app的工作环境所需要的一切.从代码,到资源,到测试到构建配置.当你创建一个新的项目的时候,Android Studio为所有的文件创建了必 ...
- UNIX环境高级编程——实现uid to name
setpwent()用来将getpwent()的读写地址指回文件开头,即从头读取密码文件中的账号数据. strcut passwd * getpwent(void); getpwent()用来从密码文 ...
- 单幅图像的深度学习,对NYU数据集进行划分
针对分割问题,官方已经划分好了:http://cs.nyu.edu/~silberman/projects/indoor_scene_seg_sup.html import numpy as np i ...
- 【Unity Shaders】Mobile Shader Adjustment—— 什么是高效的Shader
本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...
- Windows自删除程序和DLL
Windows自删除程序和DLL 参照文章 http://blog.csdn.net/rxxi/article/details/741557 做了个自删除的程序SelfDelete.代码下载(我的FT ...
- Cytoscape源码下载地址和编译办法
开发环境:Windows2008 R2 64位+Jdk1.7+Maven3.2.3 前提条件:安装好JDK1.7到C:\Program Files\Java\jdk1.7.0_67,下载好Maven并 ...
- jQuery 异步上传插件 Uploadify302 使用 (JavaEE Spring MVC)
Uploadify是JQuery的一个上传插件,实现的效果非常不错,带进度显示.而且是Ajax的,省去了自己写Ajax上传功能的麻烦.不过官方提供的实例时php版本的,本文将详细介绍Uploadify ...
- 《java入门第一季》之UDP协议下的网络编程小案例
需求,一台电脑发送数据,其他电脑都可以收到该数据.使用广播地址. 发送端: import java.io.BufferedReader; import java.io.IOException; imp ...
- Unity插件 - MeshEditor(一) 3D线段作画 & 模型网格编辑器
之前,因为工作需要,项目中需要动态生成很多的电线,不能事先让模型做好,更不能用LineRenderer之类的,因为画出来没有3D的效果,最主要是拐角的时候还容易破面,而我们要的是真真实实纯3D的电线, ...
- 海量数据挖掘MMDS week2: 频繁项集挖掘 Apriori算法的改进:非hash方法
http://blog.csdn.net/pipisorry/article/details/48914067 海量数据挖掘Mining Massive Datasets(MMDs) -Jure Le ...