APP下载

即时通讯系统的设计与实现

2020-04-15叶为正林声肯黄立轩许志明

计算机技术与发展 2020年2期
关键词:服务端即时通讯通讯录

叶为正,林声肯,黄立轩,许志明,李 晶

(中山大学新华学院,广东 广州 510520)

0 引 言

随着网络技术的发展,越来越多的人开始使用互联网,人们对网络即时通讯系统的需求量也越来越大,并且已成为当今人们交流的重要途径,这使得即时通讯技术飞速发展[1-2]。尽管市场上出现了许多第三方即时通讯提供方,如环信、融云以及腾讯云通信IM等,但自主开发出一款能在企事业单位内部使用的、进行工作沟通交流的即时通讯系统具有重要意义[3]。文中首先介绍了实现该系统所采用的技术,并在IntelliJ IDEA与HBuilder开发环境下进行编程开发,然后重点研究整个即时通讯系统的设计思路、实现方法以及实现效果。

1 相关技术

1.1 Nginx与FastDFS

Nginx是一款高性能的Web服务器[4],采用多进程的基于事件驱动的架构,全异步的网络I/O处理机制,以及极少的进程间切换设计,使得它能够同时支持百万级别的TCP连接[5]。FastDFS是用C语言编写的一款开源的分布式文件系统[6]。FastDFS是为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标。使用FastDFS可以很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务[7]。文中采用Nginx+FastDFS搭建图片服务器,用于存储用户头像和二维码等图片文件。

1.2 MUI框架与HTML5+

MUI框架,是DCloud公司发布的一款开源框架,是最接近原生App的前端框架[8]。HTML5+是HBulider利用自己的IDE结合不同平台的接口再加上HTML5[9]开发出来的一套框架,它有自己的使用规范,允许和提供了一些接口和函数来让Web[10]开发者实现原生App所能实现的功能,并且MUI以iOS平台UI为基础,补充了Android特有的UI组件[11]。

1.3 Netty框架与SpringBoot框架

Netty是一个性能极高、异步事件驱动的框架[12],是一个异步非阻塞的框架。这个框架支持多种通信协议,包括UDP、TCP以及文件传输协议等[13]。通过使用Netty,对于所有的IO操作,开发人员都可以主动地或由它内部的机制取得结果[14]。SpringBoot是由Pivotal团队开发的全新的开源开发框架,能够简化应用Spring开发项目。最突出的特点是配置方式,大大简化了Spring应用的各个方面。另外SpringBoot能够集成大量的框架,解决了之前很重要的项目之间包的版本依赖和稳定性等问题[15]。

2 平台系统结构设计

该平台采用C/S模式,前端也就是客户端采用移动应用程序的方式,后端采用SpringBoot+Netty作为主要的服务端,利用Spring MVC的注解创建RESTful Web服务。移动客户端与服务端连接读写逻辑处理均是启动阶段通过给逻辑处理链Pipeline添加逻辑处理器实现连接数据的读写逻辑。客户端连接成功回调逻辑处理器channelActive()方法,客户端/服务端接收连接数据调用channelRead()方法。写数据调用writeAndFlush()方法,客户端与服务端交互的二进制数据传输载体为ByteBuf,ByteBuf通过连接的内存管理器创建即ctx.alloc().buffer(),通过writeBytes()方法将字节数据填充到ByteBuf写到对端。Netty客户端与服务端通信流程如图1所示。

图1 Netty客户端与服务端通信流程

3 平台功能模块设计

客户端模块设计:用户通过登录或者注册进入到App时,首先会进入到聊天页面,通过底部导航进入发现页进行好友添加操作,当好友添加成功,在通讯录中即可显示已添加的好友,点击头像跳转至聊天页面。在个人信息页,可以进行头像、昵称的修改以及退出登录。平台功能模块设计如图2所示。

4 系统的数据库设计

经过对即时通讯系统的设计和功能需求分析,建立了关系数据库的实体-关系模型,确定数据库里用户、通讯录好友、好友请求、聊天信息实体。每个实体对应一个数据表,具有多个字段属性。

图2 平台功能模块设计

4.1 系统实体设计

该系统将MySQL数据库作为后台数据库,创建的后台数据库名称为IMDB,包括4个表:用户信息表、通讯录好友信息表、好友请求记录表、聊天信息表,如表1所示。

表1 即时通信系统中的表

4.2 数据表设计

在对系统需求和实际情况分析的基础上,对每个表的字段名、数据类型、完整性约束信息进行定义,便于各类资源的信息的存储和数据检索。系统数据表详细情况如表2~表5所示。

表2 用户信息

表3 通讯录好友信息

表4 好友请求信息

表5 聊天信息

5 平台功能设计与实现

5.1 关键技术

即时通讯APP开发主要包含两个部分:移动客户端和Java Web后台服务端。客户端的聊天功能通过WebSocket与后端数据进行交互,其他功能均采用MUI提供的Ajax与后端数据进行交互。

5.2 登录模块

用户第一次进入该系统时,输入用户名和密码,后端接收到用户输入的信息后,会判断数据库中是否存在该用户,若不存在则自动注册后登录,并将用户的信息通过H5+提供的API接口plus.storage.setItem(key,value)方法存储在本地数据存储区。当用户打开该软件时,系统会自动通过plus.storage.getItem(key)方法获取应用存储的值进行登录操作。

5.3 个人信息模块

在个人信息模块中,主要有查看头像、昵称、账号、我的二维码与退出登录等功能。点击头像即可查看头像、下载头像与上传头像。上传头像时,系统会调用开源图片裁剪插件Cropper进行图片的裁剪,通过前端传过来的base64字符串,然后转换为文件对象再上传到FastDFS,将拼接好的图片url写入用户对象,最后调用MyBatis对该用户对象进行更新操作。二维码是用户注册时后端使用谷歌开源项目zxing所生成的,点击二维码,即可查看二维码或者下载二维码,其他用户可以通过发现页的扫一扫功能实现添加好友的功能。点击退出登录,即可将用户的信息从系统中清除,跳转到登录模块。个人信息页面如图3所示。

图3 个人信息页面

5.4 发现模块

本模块主要有添加好友与扫一扫功能,输入好友的账号即可实现好友请求的发送。在扫一扫中也可以通过扫描好友的二维码进行添加好友的请求。通过H5+API中的Barcode模块完成二维码的扫描识别功能,获得码数据及码类型,再使用mui.ajax(url[,settings])将myUserId与friendUsername传递至后端,或者直接通过添加好友将数据传递至后端,后端根据friendUsername将朋友信息通过mybatis操作数据库查询出这个Users对象,然后再查询发送好友请求记录表(friends_request),如果sendUserId和acceptUserId没有关联,则建立关联关系,实现发送添加好友的请求。在对方登录系统后,如果忽略好友请求,则直接删除好友请求的数据库表记录,如果是通过好友请求,则互相增加好友记录到数据库对应的表,然后删除好友请求的数据库表记录。发现页面如图4所示。

图4 发现页面

5.5 通讯录模块

该模块使用MUI的Ajax将该用户的id传至后端,获取所有好友列表,通过words.convertPinyin(friend.friendNickname)将好友的昵称转化成拼音,截取拼音的首字母,构建通讯录html进行渲染。当用户下一次打开通讯录,直接从缓存中获取联系人列表渲染到页面。对好友通讯录批量绑定点击事件,当用户点击某个好友,即会打开聊天页面,并携带相应的用户参数。通讯录列表页面如图5所示。

5.6 聊天模块

在该模块的后端主要有两个类:WebSocket服务端启动类WSServer与处理类ChatHandler。聊天列表页面如图6所示。

图5 通讯录列表页面

图6 聊天列表页面

在WSServer中,由于WebSocket是基于http协议的,所以要通过pipeline.addLast(new HttpServerCodec())来添加http编解码器,此外,还要增加心跳支持以及httpWebsocket支持,最后增加自定义的处理类Chathandler以及心跳处理类HeartBeatHandler。在Chathandler中,它继承了SimpleChannelInboundHandler类,在Netty中,是用于为WebSocket专门处理文本的对象,frame是消息的载体。聊天模块实现的业务逻辑如下:

步骤1:获取客户端传输过来的消息。

通过msg.text()获取客户端传输过来的消息,通过ctx.channel()获取当前的channel,并将客户端传递至后端的json字符串转换成相应的DataContent数据内容对象。

步骤2:通过数据内容对象中action属性与后端的枚举类中的属性进行对比判断消息类型,并根据不同的类型来处理不同的业务。

(1)当websocket第一次open的时候,初始化channel,把用的channel和userid关联起来。

(2)若是聊天类型的消息时,就把聊天记录保存到数据库,同时标记消息的签收状态为“未签收”。发送消息,即从全局用户Channel关系中获取接受方的channel,若channel为空代表用户离线。当接受方receiverChannel不为空的时候,从ChannelGroup去查找对应的channel是否存在,当用户在线时,通过writeAndFlush推送消息。

(3)若是签收消息类型,就针对具体的消息进行签收,修改数据库中对应消息的签收状态“已签收”。

(4)若是心跳类型,则打印输出相应的心跳包数据。

步骤3:当触发handlerRemoved或发生异常,ChannelGroup会自动移除对应客户端的channel。若心跳处理类HeartBeatHandler类中的IdleStateEven为读写空闲时,也会关闭无用的channel,以防资源浪费。

6 系统测试与运行

该平台开发完成后,该系统服务端部署MacOS,并将Nginx+FastDFS图片服务器部署在CentOS6.5中。在小米8手机(四核,高通骁龙845,运行内存6 GB,6.21英寸屏幕,Android OS v8.0)以及iPhone 8手机(六核,苹果A11+M1协处理器,运行内存2 GB,4.7英寸屏幕,iOS v10)中对各项功能进行了测试,客户端运行良好,可以实现登录注册、修改个人信息、添加好友以及聊天的功能。

7 结束语

研究了基于Netty+SpringBoot的即时通讯系统的设计与实现,采用了HBuilder和IntelliJ IDEA开发了即时通讯系统,通过HBuilder开发出来的应用可生成适用于安卓与苹果系统的安装包,节约了开发人员同时开发不同客户端的成本,实现了基本的数据通信,可以满足日常的通信需求。

猜你喜欢

服务端即时通讯通讯录
警惕“来自手机通讯录的好友”
即时通讯在高校体育教学中的应用研究
多人联机对战游戏的设计与实现
基于三层结构下机房管理系统的实现分析
基于三层结构下机房管理系统的实现分析
通讯录信息显示方法及装置
即时通讯软件发展模型的实证研究
即时通讯软件WhatsApp
汉江水墨石专题藏家通讯录