抚州做网站公司哪家好,做海报可以在哪些网站下载素材,怎么在html链接wordpress,胶州收电脑号码是多少在之前的章节中#xff0c;我们对服务端系统的设计实现原理进行了剖析#xff0c;在这一章中#xff0c;我们将对服务端框架进行实际运用#xff0c;实现一款运行于内网环境的聊天系统。该聊天系统由客户端与服务器两部分组成#xff0c;同时服务端通过数据库维护用户的账… 在之前的章节中我们对服务端系统的设计实现原理进行了剖析在这一章中我们将对服务端框架进行实际运用实现一款运行于内网环境的聊天系统。该聊天系统由客户端与服务器两部分组成同时服务端通过数据库维护用户的账号信息。本章将重点介绍如何运用该服务端框架进行服务器业务逻辑开发。 聊天系统功能分析 本聊天系统只作为服务端框架的运用展示因此仅限于最基本的局域网聊天工具数据传输均采用为明文形式并不在安全性上进行深入探讨。具体功能需求分析如下 l 用户注册提供新用户账号注册功能注册内容包括新用户的账号名和密码。服务器需要检测注册信息的有效性并将注册用户的信息保存在数据库中。l 用户登录用户根据账号密码进行登录操作若未进行登录操作将无权限请求聊天相关消息。服务器查询数据库验证用户账号信息同时判断该用户是否已经登陆。用户账号不允许重复登录。l 在线好友更新已登录用户可以主动向服务器查询当前在线的好友信息。服务器同样应该及时向所有登录用户推送好友上线及下线信息。l 好友聊天已登录用户可以向在线状态的任意好友发送聊天消息同时也能接收到来自其他在线状态的好友发送过来的消息。l 群体聊天已登录用户可以同时向所有在线状态的好友发送群体聊天消息。同时也能接收到来自其他在线状态的好友发送的群体聊天消息。聊天系统服务端实现 数据库实现 聊天系统需要维护用户的账号信息记录注册的新账号并对每次登录的用户信息进行校验。我们选用轻量级的Mysql作为数据库管理系统并选择Mysql作为Mysql的API操作库。 整个聊天系统只建立了一个名为UserInfo表结构如表5-1所示。同时根据Mysql封装了两个操作接口分别添加新用户账号信息以及根据账号名和密码查询该用户是否存在。 表5-1 用户账号信息表UserInfo 字段名 数据类型 关键字 约束 含义 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 聊天设备类型及消息事件 临时设备类型新添加的消息事件介绍如下 l registerUsr注册新的用户账号。客户端在请求该消息事件时需同时传入期待注册的账号名和密码。服务器接收到该消息事件后将校验账号名和密码是否合法然后调用数据库新账户注册接口进行账户注册。最后根据数据库实际插入结果向客户端发送注册结果信息。由于该消息事件无需请求权限任何连接该服务器的客户均可进行注册操作。为了防止存在某些客户进行恶意注册现象在实际实现中添加了邀请码信息。服务端将会验证客户端传来的邀请码是否正确如果邀请码正确才会实际进行注册操作。l heartMsg心跳消息。客户端将会定期发送心跳消息。服务器接收到该消息事件后将会在超时队列更新该连接的超时信息。在事件回调实现中并不会对该消息进行进一步业务处理而是直接返回。 ChatType为新创建的继承于默认登录设备的设备类型具体实现的消息事件介绍如下 l askFriends请求当前在线的用户信息。客户端会在登录成功后向服务器请求该消息事件。服务器收到该消息事件后将会查询除请求者外当前其他所有在线的ChatType类型的用户信息并整理发送给客户端。该数据用于客户端对在线用户列表的初始化工作。l chatSend向一个指定在线用户发送聊天消息。客户端将会把聊天消息的内容自己的信息及期望接收该聊天消息的用户信息发送给服务器。服务端接收到该消息事件后将会尝试找寻该接收用户并将聊天消息和发送者消息转发给该接收用户并向发送用户返回发送成功消息事件。如果该接收用户并不在线将只会向发送用户返回发送失败的消息事件。l groupSend向全体在线用户发送聊天消息。客户端将会把聊天消息及自身信息发送给服务器。服务器接收到该消息后将会遍历除请求者外当前其他所有在线的ChatType类型的用户并将该聊天消息和发送者信息转发给所有遍历的用户并向发送用户返回发送成功的消息。l heartMsg心跳消息。同临时设备新添加的heartMsg的心跳消息。聊天设备的生命周期实现 虽然我们已经为聊天客户端的连接制定了具体的设备类型和消息事件但是一些和连接状态相关的业务逻辑仍然需要我们设计。比如如何制定与聊天客户端相关的具体登录过程当某个聊天客户端已经成功登录后怎样第一时间通知其他客户端该账号已上线当某个聊天客户端退出时又如何通知其他客户端该账号已下线这些与客户端状态相关的操作都依赖上一章节制定的连接生命周期机制来进行管理。 图5-2 聊天设备的生命周期 具体的聊天设备的连接生命周期实现如图所示。我们只需对具体业务相关的生命周期接口的实现进行重写即可因此无需进行更改的生命周期接口并未被列出。需要被重写的接口实现介绍如下 l onLoginCheckMsg()当客户端执行登录操作且选择登录类型为ChatType设备类型时将会执行该接口。此时系统将会检查客户端传来的账号名和密码是否合法如果合法将会调用数据库的账号密码查询接口判断该账户是否存在。如果该账户存在则返回True并将控制权交还给系统进行进一步的登录操作如果该账户不存在则向该客户端发送不存在该账号信息此次登录失败的消息并直接返回False退出整个登录操作。l onLoginSuccessMsg()当登录类型为ChatType的客户端进行登录操作执行onLoginCheckMsg()返回True且系统整个登录过程成功时将会执行该接口。此时系统将会进行两件工作首先向该客户端发送登录成功的消息其次将会遍历除该用户本身外的其他已登录的ChatType类型的用户并向这些用户发送通知消息表明该新用户已上线。这样每个登录用户只需在第一次登录的时候向服务器请求当前所有在线用户信息而新的用户上线或老用户下线等信息将由服务器主动推送而无需客户端定期请求维护。l onLoginFailureMsg()当登录类型为ChatType的客户端进行登录操作执行onLoginCheckMsg()返回True但整个登录过程失败时将会执行该接口。一般该接口被执行将表明此用户账号已经被登录服务器无法对相同账号进行重复登录操作。此时服务器将会向客户端发送重复登录此次登录失败的消息并退出整个登录操作。l onLogoutMsg()当登录类型为ChatType的客户端进行注销操作时将会执行该接口。服务器将向该客户端返回注销成功的消息并对该连接进行进一步的注销操作。l releaseConnNode()当登录类型为ChatType的客户端进行注销成功或者连接由于超时或者其它异常原因被迫退出时将会执行该接口。此时服务器将会遍历除该用户本身外的其他已登录的ChatType类型的用户并向这些用户发送通知消息表明该用户已经下线。同时系统将会把该用户连接所申请的相关资源进行释放工作。l onOverTime()当服务器一段时间内未收到该客户端有效消息或心跳消息将会被判超时并执行该接口。一般执行该接口时表明该客户端已经由于异常而停止工作但是并未主动断开连接。此时服务器将尝试向该客户端发送一条该连接已经超时的消息。由于客户端已经处于异常状态并不能保证该条消息能够被客户端接收。然后服务器将会执行releaseConnNode()接口并强制断开该客户端连接。聊天系统展示 该聊天系统部署于局域网内并可通过C#实现的客户端进行相关操作。运行场景截图如下 图5-3 登录及注册窗口 如图5-3为客户端的登录窗口与注册窗口。注册窗口通过登录窗口的注册按键打开并可进行新账号的注册操作。同时登录窗口可以进行账号的登录操作如果登录失败将会显示具体失败原因如果登录成功将会进入客户端主界面。 图5-4 主界面及好友聊天窗口 如图5-4为客户端的主界面及聊天窗口。在主界面中显示了当前登录的用户名及当前在线的用户名列及数量。可以单击具体用户名进入与该用户的聊天窗口。在聊天窗口中可以在输入栏输入消息并点击发送键或按下回车键发送该消息。如果收到其他用户的聊天消息客户端也会主动弹出该用户的聊天窗口并显示接收的的聊天信息。在主界面的下方还存在群聊按键点击可以进入群聊窗口。 图5-5 群聊窗口 如图5-5为群聊窗口。在群聊窗口中可以接收到打开了该窗口的其他用户发送的聊天信息。同时自己也能输入相关聊天消息并发送给所有该窗口下的其他用户。转载于:https://www.cnblogs.com/moyangvip/p/5586045.html