`
阅读更多
1.1课题背景
时间等于金钱,这句话是这个飞速发展时代的真实写照,随着科技的不断发展,人们越来越要求办事的效率,讨厌把宝贵的时间花在一些排队的事情上。我国是一个人口众多的国家,各大银行,邮局,医院等营业大厅常常人满为患,排着长队等着办理业务,这种局面常常使人们怨声载道。
随着社会的发展,特别是信息技术的发展,计算机已经在社会的各个方面凸显出来。原始呆板固化的排队等候方式转变为基于计算机管理与控制的舒适、休闲的等候方式。由于原始的排队等候方式存在不方便、不安全等缺点,而基于计算机管理与控制的舒适、休闲的等候方式完全可以解决这些弊端,人们不仅可以自由安排等待时间,而且可以轻松的享受其他服务,这方式不仅提高了业务员的工作效率,也提高了其业务素质。
1.2 设计的目的
排号系统是为解决一些服务业营业大厅排队问题而设计的,它能够有效地提高工作人员的工作效率,也能够使顾客合理的安排等待时间,让顾客感到服务的公平公正。
1.3 设计的基本任务
排号系统在现今的服务行业还是个比较新鲜的名词,利用这种先进的排号系统管理模式将网络技术、通信技术相结合,采用TCP/IP通信连接,使企业的服务机构通过网络与顾客通信,完成对顾客的管理。排号系统实现每个客户端可以迅速建立与服务器端的实时通信连接,并且操作互动的业务。顾客不仅可以进行取号业务,还可以进行一些其它操作,业务员除了进行业务处理还可以对数据库进行一些增删改查等操作。随着网络编程技术研究的不断深入和完善,国内外越来越多的企业己经开始使用排号系统,中国建设银行,上海长海医院等地方已开始使用,并且取得了相当的业绩和成果。
论文首先讨论了医院排号系统的背景、意义、应用现状以及研究与开发现状。本文在对C/S架构、Socket网络编程技术、Java线程编程等相关技术理论做了简单的论述。结合工程项目,具体论述了医院排号系统的需求分析、整体设计以及系统数据库的设计,其中包括业务流程图、系统用例图、功能结构图、数据流程图、以及系统数据库的E-R图的分析和描述。
其次,论文着重讨论了C/S架构的医院排号系统的设计和实现。在论文中详细地论述了医院排号系统的数据库设计与系统实现的各个步骤,并对原型系统作了简要介绍。
最后,论文对主要完成的工作进行了总结,并提出了研究的不足之处以及对今后研究的展望。
关键词:C/S架构;Java多线程;医院排号系统;Socket网络编程

二 需求分析

2.1 系统初步调查
医院是非常需要有一套通过计算机来处理排队的系统,从本质上改善传统排队管理所存在的一些混乱、无序等问题,很好地解决病员在排队中所遇到的各种混乱等现象,以静化医院的工作环境,避免无谓的争执,加快医院的现代化进程。医院排队管理系统就是在此背景下,通过对医院环境特点、排队问题特点、工作流程环节的大量调研开发出的一套计算机排队管理系统,形成有序的就医环境和工作环境,适用于各类医院。
2.2 系统可行性分析
2.2.1 经济可行性
该系统对于医院这种高消费机构,投入使用该系统不仅仅可以节约人力、物力,而且对于医院的排队环境,将使群众反映普遍良好。
2.2.2 操作可行性
目前中国移动、银行等各大重要机构都有应用类似的排号系统,对于我们来说,该系统已经比较熟悉,所以在操作的时候难度问题将会越来越低。
2.2.3 技术可行性
本系统采用Java语言编写,它是一种简单的,面向对象的编程语言,具有多线程,分布式,跨平台等特性。它有自己的安全机制,并且移植性很好。在数据库方面采用了SQL Server 2000,其灵活性,安全性和易用性为数据库编程提供了良好的条件。
而且该数据库广泛应用于各种环境,系统使用和维护的时候很具有通用性。

2.3 系统开发环境概述
2.3.1 硬件环境
本系统采用单机操作方式,基本配置如下;
处理器:Intel(R) Pentium(R) M 786MHz 2.13GHz
硬盘空间:80GB
内存:512MB
显示器:ATI X30
2.3.2 软件环境
采用C/S架构,使用Eclipse运行环境
开发平台:Eclipse+salories10
操作系统:Windows XP
数据库服务器:SQL Server2000
使用技术:Java GUI、JDBC、Socket

2.4 系统需求分析
2.4.1 业务流程分析
在调研过程中,已了解到所涉及的业务流程如图2-1所示:

图2-1 业务流程图
2.4.2 系统体系结构
系统体系结构如图2-2系统体系结构所示:


图2-2 系统体系结构
2.4.3 系统逻辑模型
系统逻辑模型如图2-3所示:

图2-3 系统逻辑模型

2.5 系统需求定义
2.5.1 病人用例图
病人用例图如图2-4病人用例图所示:

图2-4 病人用例图
2.5.2 医院工作人员用例图
医院工作人员用列图如图2-5所示:



图 2-5 医院工作人员用列图

三 总体设计
3.1 系统设计目的与任务
系统设计阶段的主要目的是,将系统分析阶段所提出的、充分反映病人信息需求的系统逻辑方案转换成可以实施的、基于计算机和网络技术的物理方案。这一阶段的主要任务是从信息系统的总体目标出发,根据系统分析阶段对系统的逻辑功能的需要,并考虑到经济、技术和运行环境等方面的条件,确定系统的整体结构和系统各组成部分的技术方案,合理选择计算机和通信的软件、硬件设备,提出系统的实施计划。
3.2 开发设计思想
医院排号系统从界面上看主要实现两个方面的功能:
(1)取号 客户按键反馈给服务器,然后服务器从数据库获得一个号反馈给病人,这就完成了取号的过程,在病人取号的可视化界面上病人可以查询当前取号总人数,也可查询到已处理的人数,在病人想放弃当前的号票时也可以对号票进行删除,病人还可以在可视化界面看到自己的取票信息和需要等待的人数。
(2)叫号 医院工作人员按键反馈给服务器,服务器拿到取号时存储在数据库中的数据,进行业务处理,在这个过程中医院工作人员可以进行对病人人数的查询,还可以对不需要进行处理的票号进行删除,也可已充当管理员的角色对数据库进行删除。医院工作人员还可以查看病人的取票情况,以及票号的业务的处理情况。
医院排号系统的特点:
(1)可操作性
界面简易,使用通用的菜单式风格,使用直观,操作简便。
(2) 容量大
支持联网,不限制取号数量,可满足大型客流场所的使用。
(3)高性能
系统的所有对象都存放到数据库中,表示逻辑与业务逻辑相互分离,保证系统的处理能力。
(4)伸缩性
它能适应不同的应用环境,对于只实现基本功能的服务大厅,如银行系统,可以采用微机控制的医院排号系统,无需单独配置系统电脑,即可实现自动排队叫号的功能。
(5)可靠性
能保证长时间的正常运行,同时系统有比较好的安全机制,提高了安全性能。
3.3 系统总体设计框架
据以上章节所做需求分析对系统进行功能设计,见系统功能模块图如图3-1所示:













图3-1 系统的总体功能模块图



四 详细设计
4.1 系统功能详细设计
该系统功能从服务器端和客户端角度来说可分以下两大模块,具体每一个模块又分为几个小模块:
(1) 服务器端
1)取号功能:打开服务器与终端进行通信。由于把服务器设置到了病人的一端,所以在服务器端进行取号,然后把号存到数据库中。
2)统计功能:数据访问层从数据库中查出所有取票人数和等待人数在服务器端界面显示。
3)删除功能:删除当前取票病人的牌号。
4)查询功能:病人可以从此处了解到所有病人的取票情况及被处理状况。
5)通知功能:从服务器端获得牌号,通过服务器端通知***病人到***工作台办理业务。
(2) 客户端
同一时刻允许多个工作台办理业务。病人通过在服务器端的通知功能知道去哪个工作台办理业务,工作台显示正在为哪个号码的病人办理业务。
1) 登录功能:医院工作人员从此处登录,医院工作人员的姓名,密码是事先录入数据库的。
2) 叫号功能:医院工作人员点击处理按钮触发事件发送信息给服务器,服务器从数据库拿到号票,返回给医院工作人员进行业务处理。
3)统计功能:数据访问层从数据库查询总取票人数和查询未处理人数在业务端显示。
4) 删除功能:医院工作人员可以删除数据库中所有的记录,也可以选择删除某条记录。
5) 查询功能:医院工作人员可以查询所有病人的取票情况及医院工作人员对号票的处理情况,这块主要为了能够及时掌握病人取票信息及医院工作人员处理情况。

4.2 数据库设计
4.2.1数据库需求分析
通过对医院排号系统内容和数据流程分析,设计的数据项和数据结构如下:
(1)病人信息。包括的数据项有病人ID,病人牌号、取号时间、状态标志等。
(2)业务端信息。包括的数据项有业务ID、处理时间、服务台编号、服务的病人票号。
(3)医院工作人员信息。包括的数据项有医院工作人员姓名、医院工作人员密码。
(4)自动出号信息。包括的数据项有ID、服务类型。
有了上面的数据结构、数据项和数据流程,就可以进行下面的数据库设计。
4.2.2数据库概念设计
这一设计阶段是在需求分析的基础上,设计出能够满足病人需求的各种实体,以及它们之间的关系,为后面的逻辑结构设计打下基础。根据上面的设计规划出的实体有病人信息实体、业务端信息实体、医院工作人员信息实体、自动出号信息实体。业务端信息实体E-R如图4-1所示,各个实体的E-R图及其关系描述如图4-2所示:









图4-1业务端信息实体E-R图


图4-2医院工作人员信息实体E-R图


病人信息实体E-R如图4-3所示,实体之间的关系E-R如图4-4所示:


图4-3 病人信息实体E-R图
图4-4 实体之间关系E-R
4.2.3 数据库逻辑结构设计
在上面的实体以及实体之间关系的基础上,形成各个表格之间的关系。医院排号系统数据库中的各个表的设计结果如下面的几个表格所示,每个表格表示数据库中的一个表。
(1) 病人信息表customer_tbl
表customer_tbl用来保存病人取票信息
字段名 字段类型 中文描述 备注 非空 主键
Id NUMBER 唯一标识 √
nextId NUMBER 病人牌号 Unique √
takeDate Date 取票日期 √
flag NUMBER 处理标记 Unique √
(2) 业务端信息表work_tbl
表work_tbl用来保存业务端信息
字段名 字段类型 中文描述 备注 非空 主键
Id NUMBER 唯一标识 √
processDate Date 处理日期 √
workId NUMBER 服务台编号 √
nextId NUMBER 病人牌号 Unique √

(3) 医院工作人员信息表workmen_tbl
表workmen_tbl用来表示医院工作人员信息
字段名 字段类型 中文描述 备注 非空 主键
Id NUMBER 唯一标识 √
name varchar2(20) 用户名 √
password varchar2(20) 密码

(4) 自动出号信息srt_tbl
表srt_tbl用来产生唯一的号票信息
字段名 字段类型 中文描述 备注 非空 主键
nextId NUMBER(20) 病人牌号 √

4.2.4 系统安全性设计
(1) 数据因素:系统数据库中包含多个表信息,所以在系统与数据库的连接上,直接封装到代码中,由于java的安全机制比较好,所以数据信息在存储和传递过程中不可见。
(2)硬件及物理因素:系统硬件及安全环境安全可靠,包括机房设施、计算机主体、存储系统、数据通信设备设施等方面是安全的。
(3) 存储安全:通过SQL Server 2000的数据库安全设置,连接数据库需要用户名和密码,保证了数据库的安全性[1]。
五 系统的调试

5.1 系统的总体概述
医院排号系统采用java GUI设计的界面,它通过scoket实现点对点的通信,在实现过程中,客户取号的一端设置成了server端,医院工作人员处理一端设置成了client端,所以必须先启动server端,才能启动client端。在整个系统中server端实现了病人的取号功能和一些查询删除功能,client端实现了医院工作人员登录和叫号处理以及一些查询删除功能[2]。
5.2 系统相关技术简介
5.2.1 C/S的简介 
传统的应用体系结构模式主要有两种:C/S(Client/Server)结构模式B/S(Browser/ Server)结构模式。
C/S(Client/Server)结构,即大家熟知的客户机和服务器结构。它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。目前大多数应用软件系统都是C/S形式的两层结构,由于现在的软件应用系统正在向分布式的Web应用发展,Web和Client/Server应用都可以进行同样的业务处理,应用不同的模块共享逻辑组件;因此,内部的和外部的用户都可以访问新的和现有的应用系统,通过现有应用系统中的逻辑可以扩展出新的应用系统。这也就是目前应用系统的发展方向[3]。
C/S体系结构的优点:
(1) 应用服务器运行数据负荷较轻。
最简单的C/S体系结构的数据库应用由两部分组成,即客户应用程序和数据库服务器程序。二者可分别称为前台程序与后台程序。运行数据库服务器程序的机器,也称为应用服务器。一旦服务器程序被启动,就随时等待响应客户程序发来的请求;客户应用程序运行在用户自己的电脑上,对应于数据库服务器,可称为客户电脑,当需要对数据库中的数据进行任何操作时,客户程序就自动地寻找服务器程序,并向其发出请求,服务器程序根据预定的规则作出应答,送回结果,应用服务器运行数据负荷较轻[4]。
(2) 数据的储存管理功能较为透明。
在数据库应用中,数据的储存管理功能,是由服务器程序和客户应用程序分别独立进行的,前台应用可以违反的规则,并且通常把那些不同的(不管是已知还是未知的)运行数据,在服务器程序中不集中实现,例如访问者的权限,编号可以重复、必须有客户才能建立定单这样的规则。所有这些,对于工作在前台程序上的最终用户,是“透明”的,他们无须过问(通常也无法干涉)背后的过程,就可以完成自己的一切工作。在客户服务器架构的应用中,前台程序不是非常“瘦小”,麻烦的事情都交给了服务器和网络[5] 。
5.2.2 Socket的简介
Socket 是一种软件形式的抽象,用于表达两台机器间一个连接的“终端”。在java中创建一个Socket,用它建立与其他机器的连接。从Socket得到的结果是一个InputStream以及OutputStream或Reader和Writer,以便将连接作为一个I/O流对象对待。这有两个基于数据流的套接字类:一个是ServerSocket,服务器用它“侦听”进入的连接;另一个是Socket,客户用他初始化一次连接。一旦客户(程序)申请建立一个套接字连接,ServerSocket就会返回(通过accept()方法)一个对应的服务器端套接字,以便进行直接通信。可以利用getInputStream()以及getOutputStream()每个套接字产生对应的InputStream和OutputStream对象。这些数据流必须封装到缓冲区内。在医院排号系统中采用了TCP/IP协议,这样实现了点对点通信等功能[6]。
5.2.3 JAVA多线程技术
(1)多线程[7]
多线程编程技术是Java语言的重要特点。多线程编程的含义是将程序任务分成几个并行的子任务。特别是在网络编程中,你会发现很多功能是可以并发执行的。比如网络传输速度较慢、用户输入速度较慢,你可以用两个独立的线程去完成这两个功能,而不影响正常的显示或其它功能。
多线程是与单线程比较而言的,男科门诊的Windows采用单线程程序结构,其工作原理是:主程序有一个消息循环,不断从消息队列中读入消息来决定下一步所要干的事情,一般是针对一个函数,只有等这个函数执行完之后,主程序才能接收另外的消息来执行。比如子函数功能是在读一个网络数据,或读一个文件。只有等读完这个数据或文件才能接收下一个消息。在执行这个子函数过程中你什么也不能干。但往往读网络数据和等待用户输入有很多时间处于等待状态,多线程利用这个特点将任务分成多个并发任务后,就可以解决这个问题。
(2)线程创建的方法[8]
1)从一个自定义的类中创建一个对象,这个类扩展了Thread类。
2)使用接口。在java中,用于创建线程的接口是Runable。
(3) 多线程在医院排号系统中的应用
为了实现多用户同时在线服务采用了多线程机制,在实际应用中启动一个业务端产生一个线程。业务端分布在不同的机器上,同时进行业务处理。多线程解决了并发执行造成的死锁问题。并实现了多用户同时在线处理[9]。
5.3 系统的执行流程图
服务端系统执行流程如图5-1所示:














图5-1 服务器端系统执行流程

客户端系统执行流程如图5-2所示:












图5-2 客户端系统执行流程
5.4 系统主界面的实现
5.4.1 服务器主界面的实现
用户在取号的时候必须先启动服务器,才能进行取号。服务器端主界面如图 5-3所示:

图5-3 服务器端主界面
服务器端主界面采用菜单式风格,用户可以根据需求进行取号,查询,删除等功能。界面主要采用了Grid Layout,Flow Layout,BorderLayout等布局管理器来对界面进行布局的。
5.4.2 客户端界面的实现
客户端是为医院工作人员设计的以下是客户端登录界面如图5-4所示


图5-4 医院工作人员登录界面

客户端业务处理界面如图5-5所示:


图5-5 业务处理界面
客户端业务处理界面也采用了菜单式风格,采用了布局管理器对界面进行布局管理,其中在显示这一项里采用了JTable设计的设计界面如下图5-6所示:

图5-6 员工处理情况界面
部分实现代码如下:
private Thread t;
private boolean flag;
private QueueData vipData, normData;// vip,norm队列
private DatagramSocket socket;
// 对所有客户端地址进行统一的管理
private Map<String, SocketAddress> map = new HashMap<String, SocketAddress>();
// ---------------------------------------
private SocketAddress address;
private SocketAddress mainAddress;
private ServerLog log = new ServerLog();// 服务器的日志
public QueueServer() {
vipData = new QueueData();
normData = new QueueData();
try {
socket = new DatagramSocket(9000);
log.writeLog("创建服务器成功!");
System.out.println("创建服务器成功!");
} catch (Exception e) {
log.writeLog("创建服务器失败!");
System.out.println("创建服务器失败!");
}
t = new Thread(this);
}
    public void run() {
byte[] inArray = new byte[30];
DatagramPacket inPacket = new DatagramPacket(inArray, inArray.length);
while (flag) {
try {
socket.receive(inPacket);
String str = new String(inPacket.getData(), 0, inPacket
.getLength());
/*
* str情况: 主显示屏信息:main 柜台: counter+id+type 取号台:order+id+type
*/
address = inPacket.getSocketAddress();
String subStr[] = str.split(",");
// 统一的地址处理
if (str.equals("main")) {
map.put("main", address);
} else {
map.put(subStr[0] + subStr[1], address);
}
System.out.println(map);

// ***********接收取号器信息的处理*************
if (subStr[0].trim().equals("order")) {
if (subStr[2].trim().equals("vip")) {
vipData.add();
String sendStr = vipData.getLastValue() + ","
+ (vipData.size() - 1) + ",vip";
connectClient(sendStr, subStr[0] + subStr[1]);
       if (vipData.size() == 1) {
// 向所有柜台广播
Set<String> keys = map.keySet();
for (String key : keys) {
if (key.indexOf("counter") == 0) {
connectClient("当前是否可以为"
+ vipData.getLastValue()
+ "男科门诊?", key);
}
}
}
}

if (subStr[2].trim().equals("norm")) {
normData.add();
String sendStr = normData.getLastValue() + ","
+ (normData.size() - 1) + ",norm";
connectClient(sendStr, subStr[0] + subStr[1]);

if (normData.size() == 1) {
// 向所有柜台广播
Set<String> keys = map.keySet();
for (String key : keys) {
if (key.indexOf("counter") == 0) {
connectClient("当前是否可以为"
+ normData.getLastValue()
+ "普通顾客办理业务?", key);
}
}
}
}
}

// ***********柜台信息处理****************
else if (subStr[0].equals("counter")) {
if (subStr[2].equals("vip")) {
if (vipData.size() > 0) {
int code = vipData.getFirstValue();
vipData.remove();
String sendStr = code + "";
connectClient(sendStr, subStr[0] + subStr[1]);
connectClient("请" + code + "号妇科病人到" + subStr[1]
+ "门诊室办理就诊!", "main");
} else {
connectClient("", subStr[0] + subStr[1]);
connectClient("欢迎光临", "main");
}
}
if (subStr[2].equals("norm")) {
if (normData.size() > 0) {
int code = normData.getFirstValue();
normData.remove();
String sendStr = code + "";
connectClient(sendStr, subStr[0] + subStr[1]);
connectClient("请" + code + "号病人到" + subStr[1]
+ "门诊室就诊!", "main");
} else {
connectClient("", subStr[0] + subStr[1]);
connectClient("欢迎光临", "main");
}
}
}
} catch (Exception e) {
log.writeLog("服务器处理信息失败!");
}
}
}
public void stop() {
flag = false;
}

public static void main(String[] args) {
System.out.println("ok");
QueueServer qs = new QueueServer();
qs.start();
}

}

5.5 服务器端取号的实现
在整个系统中取号是一个至关重要的环节,也是设计它的目的所在。它的实现与其他模块紧密相连,它在Server端实现的,取号分为两个服务类型:妇科门诊和男科门诊首先在数据库里建立srt_tbl这张表,它用来存储自动生成的客户牌号。它里面设置字段为nextId,nextId是用来标识病人的牌号的,而type则是用来表示病人所要选取的服务类型,妇科门诊和男科门诊。当点击其中的一个业务时它就会产生一个牌号,这个牌号是通过在dao层的一个方法实现的,dao层通过JDBC连接数据库实现数据的持久化。在取完号的同时调用Dao层的saveID()方法把这个信息保存在cuntomer_tbl表中。
(1)妇科门诊取号如图5-7所示:

图5-7 妇科门诊病人取号界面
实现代码如下:
private JFrame frame;
private Container contentPane;
private JLabel mainLbl, icoLbl; // 主信息提示
private JButton vipBtn, normBtn;
private JLabel timeLbl;
private Timer timer = new Timer(700, this);
private DatagramSocket socket;
private int id;
public GetOrderGUI(int id) {
this.id = id;
frame = new JFrame(id + "号取号台");
frame.setBounds(450, 550, 350, 150);
frame.setResizable(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
contentPane = frame.getContentPane();
initGUI();
timer.start();
try {
socket = new DatagramSocket();
} catch (Exception e) {
// 日志
}
new Receiver();
}

public void initGUI() {
contentPane.setLayout(new BorderLayout());
JPanel p1 = new JPanel(new FlowLayout());
icoLbl = new JLabel();
mainLbl = new JLabel("欢迎光临!");
p1.add(icoLbl);
p1.add(mainLbl);
JPanel p2 = new JPanel(new FlowLayout(FlowLayout.RIGHT));
vipBtn = new JButton("妇科门诊");
normBtn = new JButton("男科门诊");
timeLbl = new JLabel("当前时间:");
p2.add(timeLbl);
p2.add(vipBtn);
p2.add(normBtn);
contentPane.add(p1, BorderLayout.CENTER);
contentPane.add(p2, BorderLayout.SOUTH);
vipBtn.addActionListener(this);
normBtn.addActionListener(this);
}

// 向服务器端发送信息
public void connectServer(String informStr) {
byte[] outArray = informStr.getBytes();
try {
DatagramPacket outPacket = new DatagramPacket(outArray,
outArray.length, new InetSocketAddress("127.0.0.1", 9000));
socket.send(outPacket);
} catch (Exception e) {
}
}
public class Receiver implements Runnable {
public Receiver() {
(new Thread(this)).start();
}
public void run() {
byte[] inArray = new byte[30];
DatagramPacket inPacket = new DatagramPacket(inArray,
inArray.length);
while (true) {
try {
socket.receive(inPacket);
String str = new String(inPacket.getData(), 0, inPacket
.getLength());
String subStr[] = str.split(",");

if (subStr[2].equals("vip"))
mainLbl.setText("您的号码为" + subStr[0] + "妇科门诊," + "当前还有"
+ subStr[1] + "人在排队!");
else if (subStr[2].equals("norm"))
mainLbl.setText("您的号码为" + subStr[0] + "男科门诊," + "当前还有"
+ subStr[1] + "人在排队!");
} catch (Exception e) {
}
}
}
}。
5.6 客户端业务处理的实现
这个模块的实现主要是在不同的医院工作人员登录后选择了服务台以后才开始业务处理,业务处理的实现首先是server端调用socketThread这个多线程类,在这个类的run方法里调用了service层的unProcess(int type)方法从数据库中拿到nextId(牌号),client端从server端的输出流里获得牌号,进行处理。处理的时候会显示提示信息[10]。
因为各个单位所有的服务台是不确定的,所以在这里采用了多线程,可以按需求增加服务台数量。每增加一个服务台就启动一个线程,实现了多病人同时在线服务。由于采用了TCP协议,也实现了点对点通信。在服务台界面设计时,把id=1设为妇科门诊服务台,id>1的设为男科门诊服务台。当取妇科门诊业务的牌号大于2时候,男科门诊服务台优先处理妇科门诊业务,当处理的低于2的时候就处理男科门诊业务,如没有需要处理的男科门诊的业务就停止业务处理。以下是实现界面和实现代码:
业务处理如5-8所示
当妇科门诊人数大于2时


图 5-8 业务处理界面
主要实现代码如下:
1) 如果输入的服务台编号为1,服务台专门处理妇科门诊业务。并且客户端通过流输入把信息传到服务器端获得相应的信息再返回给客户端
if (id == 1)
{
pw.println("妇科门诊" + id);
ICustomerDao dao = (ICustomerDao) BeanFactory
.getPojo("customerDao");
IWorkDao workdao = (IWorkDao) BeanFactory
.getPojo("workDao");
2) 从服务器端读入信息
int num = Integer.parseInt(br.readLine());
if (num > 0) {
3) 把医院工作人员的信息保存到数据库中
Work work = new Work(1, 1, num);
workdao.saveWork(work);
4) 查找未处理的妇科门诊业务人数并且在标签里显示
List<Customer> list = dao.findUprocess(1);
int num1 = list.size();
lbl.setText("正在为妇科门诊业务" + num + "号病人办理业务!" + 有"+ num1 + "人等待")
}
5) id不等于1为男科门诊病人同样通过流输入把信息传递给服务器端获得相应的信息
if (id != 1) {
pw.println("normals" + id);
String temp = br.readLine();
int index = 0;
int num = 0;
6) 判断是否为妇科门诊病人,如果是,在男科门诊服务台进行优先业务处理。
if ((index = temp.indexOf("妇科门诊")) != -1) {
ICustomerDao dao = (ICustomerDao) BeanFactory
.getPojo("customerDao");
IWorkDao workdao = (IWorkDao) BeanFactory
.getPojo("workDao");
num = Integer.parseInt(temp.substring(index + 3));
if (num > 0) {
Work work = new Work(id, 1, num);
workdao.saveWork(work);
7) 查询还有多少妇科门诊号票没有处理
List<Customer> list = dao.findUprocess(1);
int num1 = list.size();
}
8) 判断是否为男科门诊
else if ((index = temp.indexOf("normals")) !=-1) {
ICustomerDao dao = (ICustomerDao)
BeanFactory.getPojo("customerDao");
IWorkDao workdao = (IWorkDao) BeanFactory
.getPojo("workDao");
num = Integer.parseInt(temp.substring(index + 7));
}
5.7客户端等待
主要使用液晶显示屏,在大厅中对排队病人进行叫号显示。原理是医生处受理后,在排队病人中按顺序取出一个

主要实现代码为:
private Vector<Integer> list = new Vector<Integer>();
private int value = 1; //下一个要添加的号码

//添加号码
synchronized public void add() {
list.add(list.size(), value++);
}

//删除号码
synchronized public void remove() {
if(list.size() > 0) list.remove(0);
}
//获得当前最后一个排队号码
synchronized public int getLastValue() {
if (list.size() != 0)
return value-1;
return 0;
}

//获得当前第一个排队号码
synchronized public int getFirstValue() {
if (list.size() != 0)
return list.firstElement();
return 0;
5.8 Dao层的实现
Dao层是整个系统的关键所在,它是实现与数据库交互的桥梁,在这层里,主要是对一些数据的增删改查,它使用了JDBC作为与数据库连接的桥梁,配合一些pojo类来完成与数据库的交互,使业务逻辑层能够调用它来完成业务逻辑。Dao层也是所谓的Dao模式,它采用了接口机制,在这一层只完成与数据库的交互,实现了低耦合[11]。
5.9置模块的实现
在系统里配置模块使用了XML解析技术来完成对XML配置文件的解析。在系统里它的作用是实现其他模块,降低了模块间的耦合度。一些数据库驱动,URL,病人名,密码都写到这个配置文件里,以便在一个数据库出问题的时候更换到另一个,这也方便了不同病人的使用。因为修改封装好的Java代码不容易,所以就采用了XML配置文件来实现低耦合。
在系统里配置模块还使用了资源配置文件,这也是为了一个系统能够在不同的企业运用,只需更改配置文件里的信息就可以。下面是XML文件解析的一些代码:
Properties pro = new Properties();
1、创建DOM解析器
DocumentBuilderFactory factory=
DocumentBuilderFactory.newInstance();
2、创建文档构建器
DocumentBuilder builder=
factory.newDocumentBuilder();
分享到:
评论
2 楼 359863987 2011-12-07  
shide
1 楼 爪哇夜未眠 2011-12-01  
这个是毕业设计吗

相关推荐

    JAVAJAVA多线程教学演示系统论文

    《JAVA多线程教学演示系统》是一篇深入探讨JAVA多线程编程的论文,它针对教育领域中的教学需求,提供了一种生动、直观的演示方式,帮助学生更好地理解和掌握多线程技术。这篇论文的核心内容可能包括以下几个方面: ...

    多线程排号系统课程设计

    【多线程排号系统课程设计】是一个计算机网络课程中的实践项目,主要目的是让学生深入了解计算机网络的原理并体验Web服务器的实现。在这个设计中,学生需要构建一个简单的Web服务器,包含用户界面(GUI)和I/O接口两...

    基于Java实现的多线程医院模拟系统设计源码

    该项目是一个基于Java实现的多线程医院模拟系统设计源码,总共有36个文件,其中26个是Java源文件,4个是PNG图片文件,其余文件包括classpath、project、prefs、gitignore、log和txt等配置和数据文件。系统旨在模拟...

    Java实现银行排号系统.rar

    在本项目中,"Java实现银行排号系统"是一个典型的多用户交互系统,它利用Java技术,特别是Java多线程和Socket网络编程,来构建一个高效、公平的排号服务。下面将详细介绍这个系统的核心技术和实现原理。 1. **Java...

    linux c 多线程安全日志系统

    在Linux C环境中,多线程安全日志系统是一种常见的需求,尤其在服务器应用程序中,它能够确保在高并发环境下正确地记录系统事件。本项目利用线程锁、信号量和文件操作技术,构建了一个安全的日志系统,同时考虑了...

    银行排号系统MFC实现和控制台实现

    银行排号系统是一种常见于金融机构的服务管理工具,用于有序地安排客户进行业务办理。本项目提供了两种实现方式:控制台程序和MFC(Microsoft Foundation Classes)应用。下面将详细讲解这两种实现方式及其涉及的...

    JAVA多线程售票系统

    JAVA多线程售票系统 本资源摘要信息将围绕JAVA多线程售票系统展开,涵盖多线程编程、同步机制和售票系统的设计思想。 多线程编程 在JAVA中,多线程编程是指在一个程序中使用多个线程来执行不同的任务,以提高程序...

    多线程java买票系统

    在Java编程中,多线程是一项关键技能,尤其在开发高效、并发的系统时更为重要。这个"多线程java买票系统"是用于教学目的,展示了如何在Java中实现多线程技术来模拟购票过程。下面将详细介绍相关知识点。 1. **线程...

    购票系统购票系统(多线程)

    【购票系统(多线程)】是一个基于VC6.0开发的软件应用,主要用于模拟实际生活中的购票流程。在这个系统中,"多线程"是一个关键的技术特点,它意味着程序可以同时执行多个任务,提高系统效率和用户体验。多线程在...

    C#多线程实时显示系统时间【VS2008源码】

    本项目“C#多线程实时显示系统时间”利用了这一特性,创建了一个能实时更新的系统时间显示程序。在Visual Studio 2008环境下开发,它为我们提供了深入理解多线程和UI更新同步的实例。 首先,多线程的基本概念是程序...

    多线程 售票系统

    在本场景中,我们讨论的是一个模拟火车站售票系统的多线程实现。这个系统通过多线程来模拟现实中售票窗口的并发操作,提高系统效率,提供更好的用户体验。 **线程的创建** 线程是操作系统分配处理器时间的基本单位...

    简单实现多线程同步示例(模拟购票系统)

    本示例“简单实现多线程同步示例(模拟购票系统)”旨在通过一个具体的实例,帮助开发者理解如何在Java中创建并管理多线程以及如何实现线程同步,确保数据的一致性和正确性。 首先,我们要明确多线程的基本概念。在...

    Delphi多线程的应用-电梯仿真系统

    在IT行业中,多线程是一种重要的编程概念,它允许程序同时执行多个独立的任务,从而提高系统的效率和响应性。在Delphi这样的集成开发环境中,多线程的应用是开发者提升应用程序性能的关键技术之一。本篇文章将深入...

    java 银行系统多线程

    在Java编程中,银行系统是一个典型的多线程应用案例,因为银行系统中涉及多个并发操作,如存款、取款、转账等,这些操作通常需要在不同的线程中并行执行以提高效率。以下是对"java银行系统多线程"这个主题的详细说明...

    模拟医院分诊排号系统.rar

    总的来说,"模拟医院分诊排号系统"是一个涵盖了Python编程、数据库设计、用户交互、并发处理、数据安全等多个IT领域的综合性项目。开发者通过合理利用Python的特性,实现了医院日常运营中的关键流程自动化,提升了...

    C#多线程互斥实例 多线程获取同一变量

    在编程领域,多线程是实现并发执行任务的重要机制,特别是在现代计算机系统中,多核处理器使得多线程成为提高程序性能的关键手段。C#语言提供了丰富的多线程支持,让我们能够编写出高效的多线程应用程序。在这个"多...

    C++毕业设计:基于Qt的多线程局域网聊天系统(含客户端+服务端).zip

    C++毕业设计:基于Qt的多线程局域网聊天系统(含客户端+服务端).zip C++毕业设计:基于Qt的多线程局域网聊天系统(含客户端+服务端).zip C++毕业设计:基于Qt的多线程局域网聊天系统(含客户端+服务端).zip C++...

    多线程框架通用多线程源码.zip

    《深入理解易语言版多线程通用框架》 ...通过深入研究"多线程5.e"中的代码,开发者不仅可以学习到多线程的基本原理,还能了解到如何在易语言中实现高效的多线程编程,为复杂系统的开发打下坚实基础。

    PB多线程实现

    PB.NET是PB向.NET框架的转型产品,它完全融入了.NET的生态系统,因此可以直接使用.NET Framework提供的多线程功能。在PB.NET中,可以使用System.Threading命名空间中的Thread类来创建和管理线程。此外,还可以使用...

Global site tag (gtag.js) - Google Analytics