客户/服务器架构的图书馆服务系统设计与实现夏帮贵(西华大学继续学院,成都610039)[摘要]针对现有图书馆手机服务系统的缺点,基于Java、Socket和Android技术,提出客户/服务器架构的图书馆服务系统的体系结构设计和解决方案。阐述客户/服务器架构的图书馆服务系统的设计思想、开发模型、主要功能模块以及关键技术的设计与实现。[关键词]图书馆服务手机图书馆客户/服务器JavaAndroid[分类号]G250.7DesignandImplementationofLibraryServiceSystemBasedonClient/ServerStructureXiaBanggui(DepartmentofContinuationEducation,XiHuaUniversity,ChengDu610039,China)[Abstract]Aimingatthedefectsincurrentmobilephonelibraryservicesystem,asolutionofsystemstructureaboutlibraryservicesystemisproposed,whichisbasedonclient/serverstructure.Thedesignthoughts,developmentframework,designandimplementationofmainfunctionmodulesandkeytechnologyofthelibrarysystembasedonclient/serverstructureareexpatiatedinthispaper.[Keywords]LibraryServicemobilephonelibraryclient/serverJavaAndroid1引言在信息时代,网络、手机、平板电脑以及其他便携式设备已成为获取信息的重要途径。图书馆的数字化,是为了将各种资源、工具和服务集成到用户系统,为用户提供桌面或浏览器嵌入式服务[1][2]。为用户提供方便、快捷的移动互联服务已成为图书馆数字化的主要特征。现有图书馆手机服务系统主要采用短信、WAP或Web接入方式等技术实现。采用短信技术,需要图书馆建立短信服务器,并与SP协商短信服务,其建设、运行和维护成本高。WAP和Web接入方式类似,前者WAP协议,后者使用HTTP协议,用户需登录图书馆网站来访问各种服务,这种方式建设成本相对较低,但响应缓慢、用户体验差。本文采用Java、Socket和Android技术,设计实现了基于客户/服务器架构的图书馆服务系统。2需求分析及技术思路读者对图书馆提供手机服务的访问需求客观存在,主要包括图书信息查询、借阅记录查询、图书续借、图书预约、电子图书下载、读者证件挂失、图书馆服务公告等需求,目前的手机图书馆服务均采用短信或WAP技术实现[3]。对于图书馆Web服务,手机、平板电脑以及其他便携式设备可以通过内置浏览器进行访问。Android平台是Google推出的基于Linux内核的嵌入式操作系统平台,广泛应用于智能手机、平板电脑以及其他便携式设备[4]。目前,还缺少Android平台中的图书馆服务应用研究。本文提出的客户/服务器架构的图书馆服务系统,其服务器端以现有图书馆系统为基础,用服务器接口封装服务请求处理和后台数据库访问等所有操作。客户端运行于Android平台,与服务器端通信采用Socket协议,通信信息以文本或XML格式封装。系统特点主要包括:系统服务器接口可直接部署到现有图书馆Web服务器,无硬件平台特殊要求,建设成本低;客户端运行于客户便携式设备,与服务器的通信采用SocketHTTP协议,数据流量小,响应速度快;与系统无关,即与特定图书管理系统无关,可方便地进行集成;客户端和服务器端接口均封装为Java类,可直接在各种Java应用程序中复用,而且具有跨平台、开源等特点,可轻松实现系统扩展、移植和集成[5]。3系统设计3.1系统体系架构设计根据用户需求,系统采用客户/服务器体系架构,如图1所示。图1图书馆服务系统架构客户端系统运行于支持Android平台的手机、平板电脑或其他便携式设备中,向客户提供各种图书馆需求服务菜单。用户选择菜单时,客户端服务接口程序将服务请求提交给服务器。在接收到服务器响应时,客户端服务接口解析响应数据包,将服务请求的处理结果显示在客户界面中。服务器端的服务接口负责接收客户端服务请求,将数据库操作请求提交给后台数据库,并将数据库处理结果封装为数据包返回客户端。3.2系统开发框架根据系统体系架构,系统开发框架如图2所示。图2系统开发框架服务器端接口包含一个数据访问类和一个请求处理类。数据访问接口类,使用JDBC实现数据库的更新(添加、删除和修改)和查询操作。请求处理类是一个JavaServlet类,接收客户端服务请求,并返回处理结果。各种数据库为图书馆现有系统的后台数据库。客户端接口包含一个请求处理类和一个结果解析类,这两个类用Java设计。请求处理类调用HttpURLConnection类访问服务器端请求处理类的UR[6]L。结果解析类调用SAXAPI解析从服务器返回的XML结果。用户界面使用AndroidActivity和视图组件实现。3.3系统功能模块分析根据系统需求,系统功能模块如图3所示。服务器端接口数据访问类书目数据库读者数据库其他数据库Android用户界面请求处理类请求处理类结果解析类客户端接口Android客户端服务器端服务接口Internet书目数据库读者数据库其他数据库服务接口手机平板电脑其他便携式设备图3图书馆服务系统功能模块系统功能模块运行于客户端,为用户提供各种图书馆服务。其中的系统设置功能用于设置访问图书馆服务使用的个人账号和服务器IP地址。系统通过数据访问类直接访问现有图书馆系统的各种数据库,数据库的管理由现有图书馆系统(如我校使用的汇文系统)完成,因而系统不需要设置数据库管理功能。4系统实现基于上文的系统设计,笔者建立了一个SQLServer数据库模拟图书馆数据库,实现了系统的服务器端接口、客户端接口和图3中的部分功能。4.1服务器端接口实现服务器端接口开发工具包括:Eclipse、JDK、Tomcat和SQLServer。(1)数据访问类实现数据访问类doSqlDb提供三个公共方法:doSqlDb()、doUpdate()和doQuery()。doSqlDb()为类的构造方法,在创建doSqlDb类对象时,建立数据库连接,同时创建用于执行数据库操作SQL命令的Statement对象。doUpdate()方法调用Statement对象的executeUpdate()方法执行通过参数传入的数据库更新命令,完成图书预约、续借和证件挂失等操作,返回操作影响的记录数。doQuery()方法调用Statement对象的executeQuery()方法执行通过参数传入的数据库查询命令,完成馆藏书目、新书信息和和借阅记录查询操作。查询结果封装为XML格式的字符串,其中XML根元素为QueryResult,每个记录为一个record子元素,记录的每个字段名作为record的一个子元素。数据访问类doSqlDb的关键代码如下:packagemyActions;importjava.sql.*;importcom.microsoft.sqlserver.jdbc.*;publicclassdoSqlDb{ConnectionCon;StatementSt;publicdoSqlDb()throwsException{//构造函数,创建数据库连接、创建执行SQL命令的语句对象//设置数据源对象参数Stringurl=jdbc:sqlserver://localhost:1408;instancename=sqlexpress;databaseName=Libreaders;user=sa;password=123;Con=DriverManager.getConnection(url);intresultSetType=SQLServerResultSet.TYPE_SS_SCROLL_KEYSET;intresultSetConcurrency=ResultSet.CONCUR_READ_ONLY;this.St=Con.createStatement(resultSetType,resultSetConcurrency);}publicintdoUpdate(Stringsql)throwsException{图书馆服务系统书目检索借阅记录查询图书续借图书预约证件挂失服务公告电子图书下载系统设置//执行SQL添加、删除和修改等更新命令,返回命令影响的记录行数returnthis.St.executeUpdate(sql);}publicStringdoQuery(Stringsql)throwsException{//执行SQL查询命令,查询结果转换为XML文本返回Stringqr=?xmlversion=\1.0\encoding=\UTF-8\?;ResultSetrs=this.St.executeQuery(sql);ResultSetMetaDatarsmd=rs.getMetaData();intnumberOfColumns=rsmd.getColumnCount();qr=qr+QueryResult;intn=0;while(rs.next()){qr=qr+record;for(inti=1;inumberOfColumns;i++){StringcolName=rsmd.getColumnName(i);qr=qr++colName++rs.getString(i);qr=qr+/+colName+;}qr=qr+/record;n++;}qr=qr+/QueryResult;returnqr;}……}数据访问类doSqlDb可部署到JRE的Lib\ext目录,供服务器的所有Java应用程序(包括Web应用程序)访问;或者部署到Web应用程序的web-inf\classes目录,供Web应用程序独立访问。(2)服务器端请求处理类实现服务器端请求处理类doServlet是一个JavaServlet类,它首先从客户端请求信息中获得服务识别代码和服务操作相关参数,然后生成相应的数据库操作SQL命令,再调用doSqlDb对象执行SQL命令完成数据库操作,最后将处理结果返回客户端。服务识别代码用于标识客户端请求的服务类型,如表1所示。表1服务识别代码服务识别代码服务类型服务操作参数1图书书目信息查询查询关键字2读者借阅记录查询读者借阅证号3图书预约读者借阅证号、图书号4图书续借读者借阅证号、图书号5证件挂失读者借阅证号6图书馆公告服务器端请求处理类doServlet关键代码如下:importjava.io.IOException;……publicclassdoServletextendsHttpServlet{protectedvoidprocessRequest(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{response.setContentType(text/html;charset=UTF-8);PrintWriterout=response.getWriter();try{Stringsid=request.getParameter(sid);//获取服务器识别代码Stringreaderid=request.getParameter(readerid);//获取读者证件号Stringbookid=request.getParameter(bookid);//获取图书号Stringkey=request.getParamet