在以前的章节中,咱们对服务端系统的设计实现原理进行了剖析,在这一章中,咱们将对服务端框架进行实际运用,实现一款运行于内网环境的聊天系统。该聊天系统由客户端与服务器两部分组成,同时服务端经过数据库维护用户的帐号信息。本章将重点介绍如何运用该服务端框架进行服务器业务逻辑开发。sql
本聊天系统只做为服务端框架的运用展现,所以仅限于最基本的局域网聊天工具,数据传输均采用为明文形式,并不在安全性上进行深刻探讨。具体功能需求分析以下:数据库
聊天系统须要维护用户的帐号信息,记录注册的新帐号,并对每次登陆的用户信息进行校验。咱们选用轻量级的Mysql做为数据库管理系统,并选择Mysql++做为Mysql的API操做库。安全
整个聊天系统只创建了一个名为UserInfo表结构,如表5-1所示。同时根据Mysql++封装了两个操做接口,分别添加新用户帐号信息,以及根据帐号名和密码查询该用户是否存在。服务器
表5-1 用户帐号信息表UserInfo网络
字段名并发 |
数据类型框架 |
关键字异步 |
约束工具 |
含义spa |
id |
int(20) |
Y |
unique |
惟一标识符 |
username |
varchar(20) |
N |
unique,not null |
帐号名 |
Password |
varchar(20) |
N |
not null |
密码 |
因为数据库操做涉及网络传输及磁盘处理,所以属于耗时操做。而在服务端框架Reactor反应池中的全部处理必须在非阻塞环境下进行,若是进行耗时操做将会阻塞当前线程,致使其它消息事件得不到及时处理。所以在Reactor中进行数据库操做应该以异步的方式进行,能够经过建立工做线程池的方式处理数据库等耗时操做。可是在本聊天系统中,只有在注册新用户和用户登陆两个场景中才涉及数据库操做。为了简化开发模型,咱们在此直接调用数据库相关的操做。
数据库部分并不是本文论述重点,所以再也不作进一步介绍。
经过分析功能需求,能够得知客户端链接主要存在两种状态下的消息请求,分别为临时状态和登陆状态。在临时状态下须要可以请求注册新用户和登陆操做,在登陆状态下须要可以请求当前在线用户信息,向某个用户发送消息类型和广播消息类型。而且因为服务器存在登陆超时的机制,客户端链接无论在临时状态仍是登陆状态,均需定时向服务器发送心跳消息。
客户端的两种状态正好对应于服务端框架制定的两种设备类型,即临时设备类型和登陆设备类型。如图5-1所示。咱们为临时设备添加新的注册帐号消息事件,用于向全部与服务端创建了链接的客户进行注册操做。同时咱们建立一个新的设备类型,名为ChatType设备类型,而且继承于登陆设备类型,用于专门处理登陆后和聊天相关的消息事件。
图5-1 聊天设备类型及消息事件
临时设备类型新添加的消息事件介绍以下:
ChatType为新建立的继承于默认登陆设备的设备类型,具体实现的消息事件介绍以下:
虽然咱们已经为聊天客户端的链接制定了具体的设备类型和消息事件,可是一些和链接状态相关的业务逻辑仍然须要咱们设计。好比如何制定与聊天客户端相关的具体登陆过程?当某个聊天客户端已经成功登陆后,怎样第一时间通知其余客户端该帐号已上线?当某个聊天客户端退出时,又如何通知其余客户端该帐号已下线?这些与客户端状态相关的操做都依赖上一章节制定的链接生命周期机制来进行管理。
图5-2 聊天设备的生命周期
具体的聊天设备的链接生命周期实现如图所示。咱们只需对具体业务相关的生命周期接口的实现进行重写便可,所以无需进行更改的生命周期接口并未被列出。须要被重写的接口实现介绍以下:
该聊天系统部署于局域网内,并可经过C#实现的客户端进行相关操做。运行场景截图以下:
图5-3 登陆及注册窗口
如图5-3为客户端的登陆窗口与注册窗口。注册窗口经过登陆窗口的注册按键打开,并可进行新帐号的注册操做。同时登陆窗口能够进行帐号的登陆操做,若是登陆失败将会显示具体失败缘由;若是登陆成功,将会进入客户端主界面。
图5-4 主界面及好友聊天窗口
如图5-4为客户端的主界面及聊天窗口。在主界面中显示了当前登陆的用户名及当前在线的用户名列及数量。能够单击具体用户名进入与该用户的聊天窗口。在聊天窗口中,能够在输入栏输入消息,并点击发送键或按下回车键发送该消息。若是收到其余用户的聊天消息,客户端也会主动弹出该用户的聊天窗口,并显示接收的的聊天信息。在主界面的下方还存在群聊按键,点击能够进入群聊窗口。
图5-5 群聊窗口
如图5-5为群聊窗口。在群聊窗口中能够接收到打开了该窗口的其余用户发送的聊天信息。同时本身也能输入相关聊天消息并发送给全部该窗口下的其余用户。