基于中间件的图书管理系统unix课程设计.docx
- 文档编号:23584472
- 上传时间:2023-05-18
- 格式:DOCX
- 页数:85
- 大小:589.28KB
基于中间件的图书管理系统unix课程设计.docx
《基于中间件的图书管理系统unix课程设计.docx》由会员分享,可在线阅读,更多相关《基于中间件的图书管理系统unix课程设计.docx(85页珍藏版)》请在冰豆网上搜索。
基于中间件的图书管理系统unix课程设计
基于中间件的图书管理系统unix课程设计
《UNIX系统与软件开发》课程设计
说明书
设计题目:
图书管理系统
专业:
计算机科学与技术
指导教师:
班级:
学号:
姓名:
同组人:
计算机科学与工程学院
2014年6月18日
前言
在信息技术发展迅猛的二十一世纪的今天,我们需要掌握的不仅仅是科学文化知识,还需要把所学到的知识合理的运用到现实生活中来。
科学技术是第一生产力,它给我们带来的不仅仅是生活中的各种便利和生活水平的不断提高,同时也给带给了我们各种各样的不同类型和不同层次的科技的领先发展的成果。
在中间件诞生之前,多采用传统C/S二层结构。
这种二层结构是计算机及软件技术发展的一大进步。
一般而言,服务器是一个进程,它等待客户机与其联系,提出某种类型的服务要求。
C/S模式在操作过程中采取的是主动请求方式。
服务对客户机服务可将结果或信息返回给客户机(双向),也可不返回(单向)。
虽然它带来了相当的灵活性,但也逐渐暴露出其客户端和服务器端负担过重的现象,并且拓展性也较差,无法跨越不同的业务部门和业务系统。
这不仅表现在技术上有难度,更重要的是在制度和安全方面。
于是,三层结构出现了
所谓三层结构,就是在原有的两层结构之间,增加一个中间层。
该中间层既包括服务也包括请求
中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源。
中间件位于客户机/服务器的操作系统之上,管理计算资源和网络通讯。
是连接两个独立应用程序或独立系统的软件。
相连接的系统,即使它们具有不同的接口,但通过中间件相互之间仍能交换信息。
执行中间件的一个关键途径是信息传递。
通过中间件,应用程序可以工作于多平台或OS环境。
它的工作机制是:
当客户端上的应用程序需要从网络中某个节点处获取一定的数据或服务时,这些数据和服务可能处于一个运行着和客户端不同的硬、软件、网络或操作系统的平台上。
C/S应用程序中负责寻找数据的部分只需访问一个中间件系统,由中间件完成到网络中找到数据源或服务,进而实现传输客户请求、重组答复信息,最后将结果送回应用程序的任务。
本次设计的中间件是交易型中间件。
交易型中间件是指用在不同行业、不同部门间的通讯转发和协议转换的软件,在不同的行业、不同的系统间提供通讯转发和协议转换的桥梁作用。
本次设计不是基于WEB的,不需要很多与WEB开发相关的知识,主要是利用UNIX系统提供的Socket库在网络底层,开发交易型中间件。
本次设计的目的是掌握利用软件工程的思想方法和TCP/IP设计出用于不同行业和部门间的通讯转发或协议转换软件—中间件,尤其掌握这种设计的思想和方法。
一、系统环境1
1、硬件环境1
2、软件环境1
二、设计目的及要求2
2.1设计目的2
2.2设计要求2
三、总体设计4
3.1程序设计组成框图4
3.2程序设计类图5
3.3程序设计流程图6
四、详细设计7
4.1基本套接字系统调用7
4.2MySQL数据库在Unix的使用8
4.2.1软件包需要8
4.2.2MySQL服务配置9
4.2.3MySQL客户端命令行工具9
4.2.4客户端命令行9
4.2.5MySQL开发接口9
五、调试与测试11
5.1调试方法11
5.2测试结果分析及讨论11
六、设计中遇到的问题及解决方法22
七、源程序清单23
7.1数据库代码23
7.2服务器代码24
7.3中间件程序33
7.4客户端程序36
八、心得体会57
九、参考文献58
一、系统环境
1、硬件环境
Pentium(R),4cpu3.06GHz,512MB内存。
2、软件环境
该图书管理系统是在windowsXP操作系统下使用Linux虚拟机环境,使用GNUC,在UNIX/Linuxmake开发工具的管理和控制下,利用UNIX/LinuxSocket库和MySQL数据库在网络的底层进行开发设计的。
二、设计目的及要求
2.1设计目的
基于UNIXSocket和MySQL数据库,设计一个交易型中间件系统。
这里的中间件是指交易型中间件。
交易型中间件是指用在不同行业、不同部门间的通讯转发和协议转换的软件,在不同的行业、不同的系统间提供通讯转发和协议转换的桥梁作用。
例如电子商务、银行代理业务软件等都是这种类型的软件。
本设计不是基于WEB的,不需要很多与WEB开发相关的知识,主要是利用UNIX系统提供的Socket库在网络底层,开发交易型中间件。
本设计的目的是使参与设计者掌握利用软件工程的思想方法和TCP/IP设计出用于不同行业和部门间的通讯转发或协议转换软件—中间件,尤其掌握这种设计的思想和方法。
在很多场合中间件部分是必须的,因为在不同的行业的网络是不允许直通的。
这里有政策的因素,有制度的要求,也有技术的成份。
2.2设计要求
(1)客户端
客户端程序可命名为client,要求带有两个命令行参数一个是服务(自己定义,并保存在/etc/services中,比如mysvr15678),另一个是目的主机(自己定义,并保存在/etc/hosts内,也可使用DNS来解析),缺省时为本机。
客户端至少要实现如下功能:
用户管理;查询;交易(交费,购物等);撤销;留迹;本地业务统计。
客户端的环境可以是Windows系统,也可以的Linux系统。
(2)中间件
中间件程序命名为middle,要带有三个参数,一个是用于服务器的服务(名字,与客户端同),第二个作为请求的服务(自己定义,并保存在/etc/services中,要区别于客户端,比如mysvr25679),第三个为目的主机(定义在/etc/hosts内),缺省时为本机。
中间件要完成与客户要求相符的功能:
是本地的本地处理,否则发往服务器方。
具体地是:
接收客户方数据;组织服务器方所需数据;重组服务方返回数据,并返回给客户方;留迹;本地业务统计。
中间件的环境可以是Windows系统,也可以的Linux系统。
(3)服务器
服务器程序命名为server,要求带有一个服务参数,与中间件的mysvr2同服务器方程序要完成客户端或中间件提出的业务请求,并做好留迹工作。
服务端环境必须是Linux系统。
(4)留迹或log
留迹或log工作在客户端、中间件和服务器三方都要做,以供统计或核对使用。
客户端或中间件方可以使用文本文件或数据库,但在服务器方必须使MySql数据库。
三、总体设计
3.1程序设计组成框图
设计过程中借助了中间件来实现主机和客户机之间的链接,它的工作机制是:
当客户端上的应用程序需要从网络中某个节点处获取一定的数据或服务时,这些数据和服务可能处于一个运行着和客户端不同的硬、软件、网络或操作系统的平台上。
C/S应用程序中负责寻找数据的部分只需访问一个中间件系统,由中间件完成到网络中找到数据源或服务,进而实现传输客户请求、重组答复信息,最后将结果送回应用程序的任务。
……
……
图3.1.1中间件服务框图
……
图3.1.2c/s客户/服务器模式框图
3.2程序设计类图
图3.2.1程序设计类图
3.3程序设计流程图
输入密码
请求服务
和数据库交换数据
图3.3.1程序设计流程图
四、详细设计
4.1基本套接字系统调用
【1】创建套接字—socket()
应用程序在使用套接字前,必须拥有一个套接字,系统调用socket()向应用程序提供创建套接字的手段。
其调用格式如下:
#include
intsocket(intdomain,inttype,intprotocol);
该调用要接收3个参数,根据这3个参数建立一个套接字,并将相应的资源分配给它,同时返回一个整型套接字号,只和一个特定的协议相联系。
实际上指定了相关五元组中的“协议”这一元。
domain(协议族):
AF_INET,AF_UNIX,AF_IPX
type(类型):
SOCK_STREAM,SOCK_DGRAM
protocol(协议):
0-让系统使用指定类型和协议族上的默认协议。
【2】绑定本地地址—bind()
当一个套接字用socket()创建后,存在一个名字空间(地址族),但它没有被命名,bind()将套接字地址(包括本地主机地址和本地端口地址)与所创建的套接字号绑定起来,即将名字赋予套接字,以指定本地半相关。
其调用格式如下:
#include
intbind(intsockfd,conststructsockaddr*my_addr,intaddrlen);
说明:
sockfd:
为socket成功时的返回值—套接字描述符。
my_addr为本方地址数据结构。
addrlen=sizeof(my_addr).
【3】监听连接—listen()
此调用用于面向连接服务器,表明它愿意接收连接。
1isten()需在accept()之前调用,其调用格式如下:
#include
intlisten(ints,intbacklog);
listen()在执行调用过程中可为没有调用过bind()的套接字s完成所必需的连接,并建立长度为backlog的请求连接队列。
backlog定义最大长度的socket等待队列。
默认值为5.
【4】connect(),accept()
这两个系统调用用于完成一个完整相关的建立,其中connect()用于客户建立连接。
accept()用于使服务器等待来自某客户进程的实际连接。
①connect
功能:
客户方调用发出的请求
用法:
intconnect(intsockfd,conststructctsockaddr*server_addr,socklen_taddrlen);
在面向连接的协议中,该调用导致本地系统和外部系统之间连接实际建立。
②accept
服务器调用,从等待从编号为s的套接字上接受客户连接请求
用法:
intaccept(ints,structsockaddr*addr,socklen_taddrlen);
③connect与accept的说明
调用accept()后,服务器等待从编号为s的套接字上接受客户连接请求,连接请求是由客户方的connect()调用发出的。
当有连接请求到达时,accept()调用将请求连接队列上的第一个客户方套接字地址及长度放入addr和addrlen,并创建一个与s有相同特性的新套接字号。
新的套接字可用于处理服务器并发请求。
【5】数据传输:
send()/write与recv()/read()
当一个连接建立以后,就可以传输数据了。
常用的系统调用有send()和recv()。
send()调用用于在参数s指定的已连接的数据报或流套接字上发送输出数据,格式如下:
intsend(ints,void*buf,intlen,intflags);
intrecv(ints,void*buf,intlen,intflags);
recv/send可由文件系统调用read/write所取代。
在处理二进制数据处理时,后者优于前者。
【6】关闭套接字:
close()
close()关闭套接字s,并释放分配给该套接字的资源;如果s涉及一个打开的TCP连接,则该连接被释放。
close()的调用格式如下:
intclose(ints);
4.2MySQL数据库在Unix的使用
4.2.1软件包需要
1)MySql服务器
mysql-server-3.23.54a-11
mysql-server-3.23.58-1.9
2)MySql客户端
mysql-3.23.54a-11
mysql-3.23.58-1.9
3)MySql开发接口库
mysql-devel-3.23.54a-11
mysql-devel-3.23.58-1.9
4.2.2MySQL服务配置
◆mysqyld服务要运行起来。
最好是设为开机自动启动。
方法:
◆chkconfig–level2345mysqldon
◆ntsysv
◆servicemysqldstart/stop/restart
◆图形方式
4.2.3MySQL客户端命令行工具
MySqyl客户端命令行工具为mysql。
其常用法为:
mysql[OPTIONS][database]
常用参数有:
-?
--help:
帮助
-D,--database=DB_name:
指定数据库
-h,--host=Host_name:
指定主机
-u,--user=DB_user_name:
指定用户
-p[…],--password[=…]:
指定密码
4.2.4客户端命令行
命令行提示符下输入:
mysql或mysql–uroot进入mysql系统。
提示符为“>”,可以使用的命令有:
showdatabases/tables;
usedatabase;
createdatabasedb;
createtabletbl;
dropdatabasedb/tabletbl;
select…fromtbl…where…
insert…intotbl…values…
update…tbl…set…where…
delete…fromtbl…where…
4.2.5MySQL开发接口
不同版本的MySql有不同的目录设置。
◆头文件:
目录:
/usr/include/mysql
使用:
#include
说明:
必要时可使用-I参数
◆库文件:
静态库:
/usr/lib/mysql/libmysqlclient.a
动态库:
/usr/lib/mysql/libmysqlclient.so
使用参数:
-L/usr/lib/mysql-lmysqlclient
◆初始化数据结构
mysql_init(&mysql);
◆连接数据库
mysql_real_connect(&mysql,"localhost","root",0,“mydb",0,NULL,0);
◆执行查询语句mysql_query
mysql_query(&mysql,"SELECT*FROMperson");//保存结果
result=mysql_store_result(&mysql);
◆处理结果集
while((row=mysql_fetch_row(result))){fprintf(stdout,"%s|\t%s\n",row[0],row[2]);
}
mysql_free_result(result);//清理数据
mysql_close(&mysql);//关闭连接
}
◆编译和链接方法
编译链接时要使用-L和-l参数
例如:
cc-omysqlmysql.c-L/usr/lib/mysql-lmysqlclient
五、调试与测试
5.1调试方法
1)安装组件:
rpm–ivhmysql-devel*.rpm
2)增加服务:
vi/etc/services
S11245/tcp
S21246/tcp
3)连接数据库:
mysql–uroot 4)运行服务器: cc-oserverserver.c-L/usr/lib/mysql-lmysqlclient ./servers1 5)运行中间件: cc–omiddlemiddle.c ./middles2s1localhost 6)运行客户端: cc–oclientclient.c ./clients2localhost 5.2测试结果分析及讨论 1)MySQL数据库的相关截图 编写mysql.script脚本文件,在文件中编写创建数据库library,在该数据库下创建admi、books、borrow、test表,并插入相应的数据,具体内容如下图所示。 1数据库library,如图5.2.1所示: 图5.2.1 2数据库library中的相关表,如图5.2.2所示: 图5.2.2 3数据库library中部分表的内容,如图5.2.3所示: 图5.2.3 2)开始时运行服务器程序server.c如图5.2.4所示: 图5.2.4 服务器通信过程中如图5.2.5所示: 图5.2.5 3)运行中间件程序middle.c,如图5.2.6所示: 图5.2.6 4)运行客户端程序client.c,如图5.2.7所示: 图5.2.7 5)实现查询图书功能,如图5.2.8所示: 图5.2.8 6)实现用户登录功能,且实现了密码不回显功能,如5.2.9所示: 图5.2.9 7)实现用户查询图书功能,如图5.2.10所示: 图5.2.10 8)实现用户借书功能,如图5.2.11所示: 图5.2.11 9)实现用户还书功能,如图5.2.12所示: 图5.2.12 10)实现用户续借功能,如图5.2.13所示: 图5.2.13 11)实现用户注销,如图5.2.14所示: 图5.2.14 12)实现管理员登录,且实现了密码不回显功能功能,如图5.2.15所示: 图5.2.15 13)实现管理员查询图书功能,如图5.2.16所示: 图5.2.16 14)实现管理员增加图书功能,如图5.2.17所示: 图5.2.17 15)实现管理员删除图书功能,如图5.2.18所示: 图5.2.18 删除图书book10后再查询改图书,提示“未找到该图书”,说明确实删除成功,如图5.2.19所示: 图5.2.19 16)实现管理员注销功能,如图5.2.20所示: 图5.2.20 17)退出系统,如图5.2.21所示: 图5.2.21 六、设计中遇到的问题及解决方法 这是我们第一次学习关于中间件的知识,对它的具体运行只是有一定程度的了解,不是很深刻,在设计中由于对UNIX知识的掌握不好,导致初期进度是相当的慢,在开始的几天里差不多就没有什么进度,后来通过我们小组成员的讨论、不断查阅资料及向老师请教,我们开始有了一点点的设计思路,设计过程中用到的知识不单单是课本上有的,还有的是课本上没介绍过的,因此这就需要我们多方的查阅资料和向老师请教。 平时我们都习惯了使用Windows的编辑器,开始的时候由于UNIX的文档编辑和Windows有着很大的区别,UNIX是全字符编辑器,所以在初期使用UNIX进行的编辑的时候有点不知道该从那下手,后来经过学习知道在其编辑过程中我们可以使用终端通过命令来实现。 还有在数据库的建立中,由于其基本程序中不带有数据库,一次我们必须自己建立一个数据库来存储信息,但是我们不知道怎样在客户端和主机程序中插入数据库,以此来存储图书信息,在指导老师和同学的帮助下,还有借助网络查了一些资料后终于解决了这一问题,等等。 在编写好程序后,发现在管理员增加图书模块,只能连续的增加图书,不能退出该选项。 在仔细研究代码后,我在管理员增加图书的代码后添加了break语句,成功的解决了错误。 其次原先若输入比菜单中选项大的数字,系统没有识别错误,继续执行。 为了解决这个错误,我在客户端的主菜单部分添加了if-else语句,对字符进行判断和错误处理,成功的解决了该错误。 其实设计中遇到的问题远比这多很多,因为掌握知识的程度不同,各种各样的编程问题都会遇到,我们坚持不懈,通过不断的学习和查阅资料、向老师请教,最后通过努力完成了任务。 七、源程序清单 7.1数据库代码 编写脚本文件mysql.script,并在脚本中编写如下内容: createdatabaselibrary; uselibrary; createtablebooks( idchar(10)notnullprimarykey, namechar(50)notnull, writerchar(50), storagechar(10) ); createtablereader( idchar(10)notnullprimarykey, namechar(50)notnull, passwordchar(15), enablechar (2)default"1" ); createtableadmi ( idchar(10)notnullprimarykey, namechar(50)notnull, passwordchar(15) ); createtableborrow ( r_idchar(10)notnull, b_idchar(10)notnull, b_datedate, statuschar (2), primarykey(b_id,r_id), foreignkey(b_id)referencesbooks(id)ondeletecascadeonupdatecascade, foreignkey(r_id)referencesreader(id)ondeletecascadeonupdatecascade ); insertintobooksvalues("1","book1","a","5"); insertintobooksvalues("2","book2","b","6"); insertintobooksvalues("3","book3","c","6"); insertintobooksvalues("4","book4","d","10"); insertintobooksvalues("5","book5","e","9"); insertintobooksvalues("6","book6","f","4"); insertintobooksvalues("7","book7","g","7"); insertintoreadervalues("00000","youke","123","1"); insertintoadmivalues("11111","root","123"); 7.2服务器代码 #include #include #include #include #include
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 中间件 图书 管理 系统 unix 课程设计
![提示](https://static.bdocx.com/images/bang_tan.gif)