WebSocket在图书馆移动信息服务中的应用
陈诗琴1, 李文江2
1重庆文理学院图书馆 重庆 402160
2重庆文理学院机电工程学院 重庆 402160
陈诗琴, ORCID: 0000-0002-4277-080X, E-mail: tsgxxx@qq.com

作者贡献声明:陈诗琴: 提出研究思路, 设计研究方案, 论文起草及最终版修订; 李文江: 程序开发实现。

摘要

目的 扩展图书馆移动信息服务渠道, 提高响应速度, 改善读者体验。【应用背景】在不同系统平台的移动终端应用, 实现图书馆信息实时异步传输。方法 利用WebSocket技术, 面向客户端发送查询指令、服务器解析查询指令、图书馆信息查询模块和信息回复客户端等过程进行设计。结果 读者点击客户端菜单, 可便捷获取图书馆服务信息。结论 数据传输效率高, 实现跨平台运行, 有利于图书馆信息服务项目的拓展。

关键词: 移动信息服务; 移动终端; WebSocket
中图分类号:TP391.1
Application of WebSocket in Library Mobile Information Service
Chen Shiqin1, Li Wenjiang2
1Library of Chongqing University of Arts and Sciences, Chongqing 402160, China)

2Faculty of Electromechanical Engineering, Chongqing University of Arts and Sciences, Chongqing 402160, China
Abstract

[Objective] Extend mobile information services channels of library, improve the response speed and enhance user experience.[Context] The system is applied to the different platforms of mobile terminal, and realizes the real-time asynchronous transmission of library information.[Methods] Using WebSocket, the process is designed for the client to send the query, the server to resolve the query instruction, the library information query module and the information reply client.[Results] The readers can click client menu, conveniently access to library information service.[Conclusions] This system has high efficiency of data transmission, realizes the cross platform operation, and conducives to the expansion of library information service project.

Keyword: Mobile information services; Mobile terminal; WebSocket
1 引 言

随着微信息生态环境、移动互联网和移动终端的快速发展, 国内一些图书馆开始尝试提供基于移动客户端的图书馆服务, 将用户需要的信息服务推送到移动终端上, 使用户可以享受泛在图书馆服务。图书馆与移动终端有效结合, 使信息传递方式更加便捷, 契合了图书馆移动信息服务的需要。

本文以重庆文理学院图书馆开发的移动图书馆移动信息服务系统为例, 详细介绍系统的设计与实现。

2 需求分析与设计思路
2.1 移动信息服务技术现状

国内图书馆移动信息服务技术的演变过程, 可分为4个时期: 早期的短信服务、中期的WAP(包括WAP1.0和WAP2.0)网站、目前流行的原生APP应用(包括图书馆微信公众平台)和已日趋成熟的HTML5 Web APP应用。

(1) 短信服务离不开发送指令, 不便于记忆, 信息容量有限且资费较高。现在仍有图书馆采用短信方式提供服务, 但只作为其他方式的补充。

(2) WAP网站虽然把图书馆Web服务功能搬到移动终端上, 但数据流量浪费较大。

(3) 原生APP应用开发对于图书馆技术人员是一个严峻考验, 一定程度上限制了图书馆移动信息服务的更好实现[1]。移动终端采用不同的系统平台, 如黑莓公司的BlackBerry, 微软的Windows Phone, 苹果的iOS以及由 Google 推出的Android平台。因此, 想要满足全部移动用户, 针对每一种平台开发相应APP, 几乎是不可能的, 目前大多只开发使用较多的Android版和iOS版。微信公众平台的出现, 为图书馆移动信息服务带来曙光: 可以借助微信APP解决开发原生APP的问题。但微信公众平台也存在一些不足, 典型的是如果信息回复延时超过5秒, 信息就回复失败的问题[2, 3, 4]

(4) Web APP是运行于网络和标准浏览器上, 基于网页技术开发实现特定功能的APP, 因此不管是iOS、Android还是其他系统, Web APP都能跨平台运行[5]。同时, Web APP在开发成本和技术难度上都小于原生APP。

目前很多图书馆移动信息服务主要集中在短信服务和WAP网站服务上, 只有部分图书馆增加了原生APP应用, 客户端包括iOS、Android两种系统版本。而应用Web APP的图书馆相对较少[6]

2.2 设计思路

(1) 技术选择

随着HTML5[7]标准的最终确立, 支持HTML5的浏览器也越来越多, 这为移动信息服务带来了新的契机, 本文基于HTML5进行Web APP的设计。

WebSocket[8]是HTML5规范新引入的技术, 解决浏览器客户端与服务器双向跨领域的异步通讯问题。WebSocket采用全新的WS或WSS协议, 设计更为轻量级的Header, 除了首次建立链接时需要发送头部和普通Web链接类似的数据之外, 其他时候相互沟通的Header非常简洁, 大大减少了冗余的数据传输。

WebSocket在很多领域得到应用[9, 10, 11], 这给图书馆服务信息的实时传输带来很大启发。本文利用HTML5的WebSocket技术实现传统的信息服务功能。

(2) 设计架构

系统整体设计架构如图1 所示:

图1 系统设计架构

以WebSocket为核心, 建立WebSocket客户端(简称“ 客户端” )和 WebSocket服务器端(简称“ 服务器” )。客户端负责收集读者需求, 并将需求信息提交给服务器, 同时负责接收来自服务器端的响应信息并呈现给读者。服务器端负责接收客户端传送的需求信息, 并将需求信息进行解析处理, 调用图书馆信息查询模块(简称“ 查询模块” ), 将查询获取的信息自动回复或推送到客户端。

这样的设计使得移动终端上的业务逻辑简单, 传输中所耗数据流量小; 并将图书馆主页网站、图书馆业务系统网站和FAQ知识库的信息查询事务放在服务器端处理, 保证信息查询的快速响应与良好的用户体验[12]

3 系统具体设计
3.1 功能设计

图书馆移动信息服务系统要求通过客户端与读者号绑定, 实现图书馆信息推送、“ 我的书斋” 信息查询、参考咨询等服务的信息交换功能。目前主要设计三个模块: “ 信息推送” 、“ 我的书斋” 和“ 参考咨询” 。其中前两个模块主要是针对图书馆主页网站和图书业务系统进行查询, 另一模块主要针对自建FAQ知识库进行信息查询。其主要功能如图2所示:

3.2 实现流程设计

基于上述设计思路和功能设计, 系统实现流程如图3所示:

图3 系统实现流程

整个系统主要有三个部分, 客户端、服务器和查询模块。其中服务器和查询模块集成在一起。

(1) 当读者首次使用客户端时, 提示读者输入服务端IP, 并将IP地址保存到客户端本地, 客户端与服务器建立双向通讯。同时提示读者绑定读者号。

(2) 用户读者号绑定, 读者在客户端输入读者号、密码并发送到服务器, 服务器将读者号、密码和客户端地址IP标识存储在数据库中, 为信息推送做准备。同时客户端本地也保存读者号和密码, 便于下次登录客户端使用。

(3) 读者在客户端点击相应功能查询按钮后, 服务器接收并判断按钮指令, 启动相应的查询模块, 进行信息查询, 返回查询结果, 并发送给客户端。

4 系统具体实现
4.1 客户端设计

客户端是通过HTML5标签、CSS3布局控制和JavaScript程序实现自适应智能设备屏幕大小的HTML5页面, 由下拉菜单、信息显示文本框、发送咨询信息文本框及发送按钮组成, 主要完成与服务器建立连接、发送包含指令的信息和接收图书馆信息三项工作。具体工作流程如图4所示:

图4 客户端工作流程

(1) WebSocke API

WebSocket设计比较精炼, 在支持WebSocket的浏览器中, 客户端可直接通过JavaScript程序调用WebSocket方法, 轻易实现数据实时传输。WebSocket的主要方法如表1所示:

表1 WebSocket主要方法

其中, onmessage方法提供一个data属性, 可以包含消息的body部分, 通过event.data可以获取。消息body部分必须是一个字符串(文本或二进制), 可以进行序列化/反序列化操作, 以便传递更多的数据。

(2) 建立连接与信息接收

客户端与服务器的连接主要过程如下:

①客户端向服务器发送HTTP报头, 请求握手;

②服务器依据HTTP报头判断识别是否为WebSocket请求;

③识别成功后, 服务器返回响应的HTTP报头;

④将客户端的请求升级为一个WebSocket连接;

⑤客户端实时接收信息。

客户端与服务器建立连接的主要过程伪代码如下:

//建立WebSocket实例

var socket;

socket = new WebSocket("ws://localhost:9000/");

//客户端与服务器建立连接

socket.onopen = function (msg) {//连接成功后执行的操作};

//服务器消息监听

socket.onmessage = function (msg) {
//执行显示接收消息等操作};

//连接关闭触发的事件

socket.onclose = function (msg) { //连接关闭后执行的操作};

(3) 信息本地存储

为了客户端持久保存服务器IP地址、读者号和读者密码, 便于读者再次访问时不再输入以上信息, 选择localStorage对象将以上信息进行持久本地保存。当他人使用手机时, 可以手动清除读者号和密码, 输入自己的读者号和密码。同时也将读者获取的历史信息进行本地保存, 便于再次查看。

(4) 指令编码与信息发送

客户端发送读者请求指令信息, 主要采用点击菜单方式实现, 可提高读者的体验效果。与服务器交互的每个菜单都对应不同的指令信息, 其指令的编码方式主要分为两种:

①发送独立的指令信息, 如发送“ 21” 指令;

②发送复合指令信息, 如发送“ 26& value” 或“ 31& value1 # value2” 等指令, 其中value、value1或value2参数通过弹出式JavaScript对话框输入。

两种编码方式的指令信息, 统一作为一个字符串, 并在此字符串末尾加“ \0” 字符串, 利用socket.send方法进行封装发送。不同菜单调用相同的socket.send方法, 送入自己对应的指令信息字符串即可。

4.2 服务器设计

服务器根据WebSocket协议, 负责解析和封装WebSocket数据包。目前已有几款比较好的开源库, 可以调用开源库接口, 实现WebSocket数据包的解析与封装, 很大程度上减少了设计难度。本文选择傲瑞轻量级的通信引擎 StriveEngine组件[13], 利用Windows Form应用程序方式设计服务器程序。程序自动完成客户端握手协议、接收WebSokect数据帧数据解析和发送消息的WebSokect数据帧封装。

(1) StriveEngine组件调用

StriveEngine组件的关键类如表2所示:

表2 StriveEngine关键类介绍

在.NET环境下引用StriveEngine组件, 在开发中调用相应功能即可。其实现过程如下:

①利用NetworkEngineFactory.CreateTextTcpServerEngine类, 通过工厂的静态方法, 创建TCP文本协议引擎实例;

②通过过程委托方法, 将ClientConnected、Message Received、ClientCountChanged和ClientDisconnected方法委托给自定义的相应方法;

③NetworkEngineFactory创建的通信引擎实例, 必须调用Initialize初始化方法后, 引擎才能正常启动。

(2) 客户端数据的接收与发送

WebSocket客户端数据的接收与自动发送的主要实现过程如下:

①从MessageReceived方法中, 获取客户端发送的字符串;

②剔除字符串的结束标记符号“ \0” ;

③利用“ & ” 和“ #” 分隔符, 分离字符串中的指令和信息内容, 完成指令信息的解析;

④根据分离的指令并判断其数字, 启动相应的图书馆信息查询子系统;

⑤将获取的图书馆信息, 自动发送给客户端。

以下是过程实现的tcpServerEngine_Message Received程序方法, 其主要执行过程如下:

Private Sub tcpServerEngine_MessageReceived (client As
IPEndPoint, bMsg As Byte())

//获取客户端发送的信息

Dim msg As String = Encoding.UTF8.GetString(bMsg)

//将信息的结束标记“ \0” 剔除

msg = msg.Substring(0, msg.Length - 1)

//将信息中的指令数字进行分离

Dim str As String( ) = msg.Split("& ")

//指令数字判断, 启动相应的图书馆信息查询子系统

Select Case str.First

Case 1

//启动对应的图书馆信息查询子系统

… …

//向客户端发送查询结果信息

send_string(client, "具体查询信息")

… …

End Select

End Sub

以下是信息发送send_string方法(包括自动回复和主动推送信息使用同一方法)的执行过程:

Private Sub send_string(client As IPEndPoint, send_str As String)

//发送信息前端与末尾处理

Dim msg As String = "图书馆:" + send_str + vbCrLf & vbNullChar

//设置发送信息编码方式

Dim bMsg As Byte() = Encoding.UTF8.GetBytes(msg)

//向客户端发送信息

Me.tcpServerEngine.SendMessageToClient(client, bMsg)

End Sub

(3) 读者身份信息存储

客户端与服务器端握手成功后, 服务器端自动获取客户端IP地址和端口, 作为通讯身份。但在自动推送信息时, 客户端IP地址和端口会随着网络环境变化, 不能确定读者身份。所以必须将每次登录的IP地址与读者号建立联系, 才能确定读者身份。其实现办法是客户端每次与服务器握手成功后, 重新自动发送客户端本地保存的读者号, 并将读者号、客户端IP地址和端口存储在数据库表中。

4.3 图书信息处理子系统

系统需要从图书馆主页网站、业务网站和FAQ知识库获取信息, 采用以下获取形式: 网站上的信息直接从Web页面提取, 以确保图书馆系统数据库的安全; 图书馆主页信息, 可直接分析HTML标签来提取; 业务系统网页信息, 需要先模拟登录再提取; FAQ知识库中的信息需连接AIMLBot 智能机器人进行获取[14]

(1) Web页面数据提取

应用网页数据分析工具HttpWatch Studio[15]、网站模拟登录控件Czt.Web[16]和HTML解析组件HtmlAgilityPack[17]实现页面数据提取, 实现过程如下:

①利用网页数据分析工具HttpWatch Studio分析图书馆业务系统登录页面, 获取登录PostData数据, 并将其中的读者号和密码使用变量代替;

②将页面登录入口地址、PostData数据、登录成功后的访问地址、网页编码方式和method方式参数, 送入模拟登录控件PostData方法中执行登录;

③登录成功后, 利用模拟登录控件GetPage方法, 访问需提取数据的Web页面, 获取整页HTML字符串;

④将HTML字符串传给HTML解析组件完成页面解析, 提取所需内容;

⑤对提取数据进行清洗。

(2) FAQ知识库信息获取

服务器系统与AIMLBot机器人对接整合, 将读者输入信息完成解析后, 送入机器人推理查询入口, 获得查询结果后, 送入服务器系统进行用户回复。

5 系统运行环境及测试效果

(1) 系统运行环境

服务器程序要求在Windows操作系统、Microsoft .NET Framework 3.5框架下安装并运行。客户端HTML5程序, 要求移动终端安装支持HTML5的浏览器。

(2) 测试效果

以读者“ 20020013” 首次查询“ 当前借阅” 为例, 运行客户端index.html程序进行测试:

①设置服务器地址。点击“ 系统设置” → “ 设置服务器” , 弹出输入服务器地址对话框, 输入后客户端与服务器握手通讯。握手成功后, 服务器开始监听客户端发送的指令请求。

②绑定读者号。点击“ 系统设置” → “ 读者号绑定” , 弹出输入读者号对话框, 输入读者号后弹出输入密码对话框, 输入密码后将输入的账号信息提交给服务器, 由服务器程序与图书馆业务系统进行验证, 验证通过后返回绑定成功信息。

③当前借阅查询。先登录图书馆业务系统查询“ 当前借阅” 情况, 如图5所示:

图5 图书馆业务系统中当前借阅情况

点击客户端“ 我的书斋” → “ 当前借阅” , 返回查询结果如图6所示:

图6 客户端显示当前借阅情况

比较两个查询结果, 数据是一致的, 验证了图书馆业务系统网站数据的提取方法是可行的。除首次使用外, 不需再设置服务器地址和绑定账号。从客户端显示的测试结果来看, 不需要刷新HTML5页面, 就可与服务器进行实时数据传输, 基本实现设计要求。

6 结 语

本文设计并实现了图书馆移动信息服务系统。为使其发挥更大的作用, 可在目前系统的基础上, 提供更多图书馆信息查询服务, 扩展读者个性化信息的定制与推送服务。从而为读者提供更贴切、更便捷的服务。

参考文献
[1] 范跃华. 基于智能手机APP的图书馆个性化信息推送服务[J]. 图书馆学刊, 2014(6): 116-118.
(Fan Yuehua. Library Personalized Information Push Service Based on Smartphone APP[J]. Journal of Library Science, 2014(6): 116-118. ) [本文引用:1]
[2] 罗晓涛. 基于微信公众平台的图书馆信息推送服务[J]. 图书馆学刊, 2014(4): 66-69.
(Luo Xiaotao. Library Information Push Service Based on WeChat Public Platform[J]. Journal of Library Science, 2014(4): 66-69. ) [本文引用:1]
[3] 李文江, 陈诗琴. 微信作为APP客户端的图书馆公共服务平台[J]. 现代图书情报技术, 2014(7-8): 133-138.
(Li Wenjiang, Chen Shiqin. WeChat as Library Public Service Platform for the APP Client[J]. New Technology of Library and Information Service, 2014(7-8): 133-138. ) [本文引用:1]
[4] 江波, 覃燕梅. 基于微信的移动图书馆APP服务系统设计与实现[J]. 现代情报, 2013, 33(6): 41-44.
(Jiang Bo, Qin Yanmei. Design and Implementation of Mobile Library APP Service System Based on WeChat[J]. Journal of Modern Information, 2013, 33(6): 41-44. ) [本文引用:1]
[5] Web APP [EB/OL]. [2015-04-07]. http://baike.baidu.com/view/8346651.htm. [本文引用:1]
[6] 夏翠娟, 张燕. 图书馆移动阅读服务的新契机: HTML5和CSS3[J]. 现代图书情报技术, 2012(5): 16-25.
(Xia Cuijuan, Zhang Yan. The New Chance of Library Mobile Reading Services: HTML5 & CSS3[J]. New Technology of Library and Information Service, 2012(5): 16-25. ) [本文引用:1]
[7] HTML5 [EB/OL]. [2015-04-07]. http://www.w3.org/TR/html5/. [本文引用:1]
[8] WebSocket [EB/OL]. [2015-04-07]. http://baike.baidu.com/view/3623887.htm/. [本文引用:1]
[9] 吕海东. 基于WebSocket的实时Web监控系统[J]. 工业控制计算机, 2014(6): 82-83.
(Lv Haidong. Real-Time Web Monitoring System Based on WebSocket[J]. Industrial Control Computer, 2014(6): 82-83. ) [本文引用:1]
[10] 柳纲, 李佳阳, 张毅. WebSocket技术在EMS信息实时发布中的应用[J]. 电力信息与通信技术, 2013, 11(10): 30-33.
(Liu Gang, Li Jiayang, Zhang Yi. Application of WebSocket on Real- time Information in EMS System[J]. Electric Power Information and Communication Technology, 2013, 11(10): 30-33. ) [本文引用:1]
[11] 白海波. WebSocket技术在体育赛事网站中的研究与应用[D]. 上海: 东华大学, 2014.
(Bai Haibo. The Research and Application of WebSocket on Sports and Games Websites [D]. Shanghai: Donghua University, 2014. ) [本文引用:1]
[12] 郭文丽, 严潮斌, 吴旭. 基于Android客户端的图书馆微服务研究与实践[J]. 图书情报工作, 2013, 57(8): 22-26.
(Guo Wenli, Yan Chaobin, Wu Xu. Research and Practice of Library Micro-services Based on Android[J]. Library and Information Service, 2013, 57(8): 22-26. ) [本文引用:1]
[13] 傲瑞组件开发手册(02)—轻量级的通信引擎StriveEngine [EB/OL]. [2015-04-06]. http: //blog. oraycn. com/StriveEngine. aspx.
( The Proud Red Component Development Manual StriveEngine (02)-Lightweight Communication Engine [EB/OL]. [2015-04-07]. http://blog.oraycn.com/StriveEngine.aspx [本文引用:1]
[14] 李文江, 陈诗琴. AIMLBot智能机器人在实时虚拟参考咨询中的应用 [J]. 现代图书情报技术, 2012(7-8): 127-132.
(Li Wenjiang, Chen Shiqin. Application of AIMLBot Intelligent Robot in Real-time Virtual Reference Service[J]. New Technology of Library and Information Service, 2012(7-8): 127-132. ) [本文引用:1]
[15] HttpWatch 10 [EB/OL]. [2015-04-07]. http://www.httpwatch.com/. [本文引用:1]
[16] c# winform实现网页上用户自动登陆, 模拟网站登录[EB/ OL]. [ 2015-04-07]. 模拟网站登录[EB/ OL]. [2015-04-07]. http: //www. cnblogs. com/jayleke/archive/2010/08/14/1799702. html.
( c# winform to Realize Automatic Web Page the User Login, Simulate the Website Login[EB/OL]. [2015-04-07]. http://www.cnblogs.com/jayleke/archive/2010/08/14/1799702.html [本文引用:1]
[17] HTML Agility Pack [EB/OL]. [2015-04-07]. http://htmlagilitypack.codeplex.com/. [本文引用:1]