一个简单的IM系统(Demo附源码)-- ESFramework 4.0 快速上手(08)

简介: 前面的文章已经介绍完了基于ESFramework/ESPlus进行二次开发的所有要点,现在,我们可以开始小试牛刀了。       本文将介绍使用ESFramework的Rapid引擎开发的两个最简单的Demo,ESFramework.Demos.Simplest 和 ESFramework.Demos.Silverlight。

      前面的文章已经介绍完了基于ESFramework/ESPlus进行二次开发的所有要点,现在,我们可以开始小试牛刀了。

      本文将介绍使用ESFramework的Rapid引擎开发的两个最简单的Demo,ESFramework.Demos.Simplest 和 ESFramework.Demos.Silverlight。这两个Demo是一个简单的聊天系统,并演示了以下功能:

(1)客户端用户上下线时,通知其他在线用户。

(2)当客户端与服务端网络断开时,进行自动重连,当网络恢复后,重连成功。

(3)所有在线用户之间可以进行文字聊天。

(4)消息同步调用

(5)重登陆模式。当同名的用户登陆时,会把前面的用户挤掉。

(6)在控制台程序中启动服务端引擎。 

一.步骤说明

      按照ESFramework 开发手册(06) -- Rapid通信引擎一文中提到的二次开发步骤,我们按照顺序来一步步来实现这个demo。(请从文末下载demo源码,然后对照着看,将更容易理解)     

1.确定是否需要好友关系。在本demo中,我们假定所有的在线用户都是好友,这样就可以直接使用ESPlus提供的DefaultFriendManager

2.确定是否需要分组。在本demo中,我们不需要广播消息,不需要进行分组,可以完全忽略组机制的存在

3.定义信息类型与信息协议。

    在本demo中,我们只需要定义两个信息类型,一个类型表示聊天消息,一个类型表示客户端同步调用服务端。其定义如下:

    public static class InformationTypes
    {
        ///<summary>
        /// 聊天信息
        ///</summary>
        public const int Chat = 0;

        ///<summary>
        /// 客户端同步调用服务端
        ///</summary>
        public const int ClientCallServer = 100;
    }      

      由于InformationTypes的定义以及接下来定义的信息协议类在客户端和服务端都需要用到,所以,我们将其放在一个单独的项目ESFramework.Demos.Core中,客户端和服务端都可以引用它。

      信息类型定义好后,我们接下来定义信息协议。

      对于聊天消息,由于消息中除了文字之外,还可能包含表情,所以我们专门定义了一个协议类:TextChatContract。

      对于同步调用,我们的demo假设请求信息是一个字符串,回复信息也是字符串,直接使用UTF-8编码就可以了,不需要专门的协议类。或者说,string就是我们用到的协议类。
4.实现自定义信息处理器

      客户端的MainForm实现了ICustomizeHandler接口,其主要实现HandleInformation方法,来处理收到的聊天信息(信息类型为InformationTypes.Chat)。

  void HandleInformation(string sourceUserID, int informationType, byte[] info);

      服务端的CustomizeHandler实现了服务端的ICustomizeHandler接口,其主要实现HandleQuery方法来处理来自客户端的同步调用(信息类型为InformationTypes.ClientCallServer)。

  byte[] HandleQuery(string sourceUserID, int informationType, byte[] info);

5.服务端的BasicHandler类实现IBasicHandler接口,以验证登录用户的账号密码。本demo中,假设所有的验证都通过,所以验证方法直接返回true。

6.客户端在MainForm的Initialize方法中,预定了Rapid客户端引擎暴露的连接状态变化事件,如连接断开、重连开始、重连成功并重新登录完成。并且预定了IBasicOutter和IFriendsOutter的相关状态改变事件,以处理其他用户的上下线通知、被挤掉线通知、被踢出通知等。(详细介绍请参见基础功能与状态通知 以及 好友与组

7.在服务端和客户端各自的Program类的Main方法中,初始化Rapid引擎。 

      上面我们介绍了这个demo需要的主要元件,我们接下来看看客户端和服务端所需的额外基础设施。

二.服务端说明

1.在WinForm应用程序中启动服务端引擎

     如果获取了ESFramework的正式授权,那么应该在初始化服务端引擎之前,设定正确的授权用户帐号和密码。 demo中使用的是免费帐户“FreeUser”。  

 ESPlus.GlobalUtil.SetAuthorizedUser(AuthorizationVerifier.FreeUser, "");

       服务端直接使用了ESPlus提供的默认的主窗体MainServerForm,来显示在线用户状态信息。

 //如果不需要默认的UI显示,可以替换下面这句为自己的Form
ESPlus.Widgets.MainServerForm mainForm = new ESPlus.Widgets.MainServerForm(RapidServerEngine);

      服务端运行起来后,界面如下所示:     

      

(1)最下面的状态栏,显示了线程池中剩余的线程数,初始设定的后台线程池和IOCP线程都是100个。最右边的“在线人数”还显示了已成功建立的连接数-用户数。

(2)当有用户登陆时,在线用户列表中会实时显示每个用户的状态。

      文末我们会给出MainServerForm的源码,有需要的朋友可以在上面进行修改增加功能以满足自己应用的需要。 

2.在Console程序中启动服务端引擎

      解决方案中的ESFramework.Demos.ServerConsole项目是一个控制台项目,用于演示如何在控制台程序中启动服务端引擎。

      对于更多的系统,可能是要求在Windows服务中Host服务端引擎,其实也是类似的做法。这里就不再赘述了。

三.客户端

     客户端启动登陆后,显示的主界面MainForm如下:    

     

    当有其他用户登陆时,会在“在线用户列表”中显示出来,双击头像,会弹出聊天窗口,就可以对话了。   

    

     当该窗口会灰掉不可用时,表示好友已经掉线。

   如果我们再登陆一个aa01(演示重登陆),则原来aa01的主界面状态栏会显示如下:    

     

      如果Client与服务器不在一台机器上,你还可以通过断开网络在恢复网络以观察自动重连的效果,主界面的状态栏也有相应的文字提示。或者更简单地,直接退出服务端,这会断开所有的客户端连接,也类似于断线的效果;再重启服务端,客户端就会重连上来了。

      最后,点击“测试请求123”后面的按钮,可以测试消息同步调用,消息同步调用是通过客户端的ICustomizeOutter接口的Query方法来发出的,同步调用请求将被前述的服务端的HandleQuery方法处理的。

      要提醒的是,本示例仅仅是一个demo,是为了展示如何使用ESFramework提供的功能而存在,为了简洁,省略了很多工作,比如,将Rapid引擎实例作为Program的静态成员,又如上面的MainForm实现了多个接口,使得MainForm类变得比较巨大。大家在正式的项目中,应该根据项目实际情况做正确的结构设计,不要效仿本例。 

四.源码下载

    ESFramework.Demos.Simplest 源码

 

 

目录
相关文章
|
6月前
|
网络协议 NoSQL API
转转客服IM系统的WebSocket集群架构设计和部署方案
客服IM系统是转转自研的在线客服系统,是用户和转转客服沟通的重要工具,主要包括机器人客服、人工客服、会话分配、技能组管理等功能。在这套系统中,我们使用了很多开源框架和中间件,今天讲一下客服IM系统中WebSocket集群的的实践和应用。
539 141
|
8月前
|
前端开发 JavaScript Java
智能客服系统的技术栈解析-唯一客服系统技术架构优势
“唯一客服系统”采用 Vue.js 2.x + ElementUI 构建前端,实现响应式界面,支持多端适配;后端基于 Golang + Gin + GORM,具备高性能与高并发处理能力。系统支持私有化部署,提供灵活定制、AI 扩展能力,技术栈简洁易维护,兼顾开发者友好与企业级应用需求。
353 1
|
8月前
|
测试技术 Go
客服系统程序入口文件解析-唯一客服系统源码开发
该代码为 Go 语言编写的客服系统命令行程序入口,结构清晰,使用 cmd 包启动业务逻辑,可能基于 cobra 框架实现,具备良好可扩展性与可维护性,适用于服务启动与管理。
281 69
|
7月前
|
数据安全/隐私保护 容器 Go
开源IM即时通讯系统调研
Lumen IM 是一款企业级开源即时通讯工具,前端采用 Vue3 + Naive UI,后端基于 Go 语言,使用 WebSocket 协议。支持 Docker + Nginx 快速部署,适合私有化环境。功能包括文本、图片、文件消息,内置笔记、群聊及消息历史记录。界面美观、功能完善,适用于企业沟通、团队协作及开发者学习。提供前后端源码,便于快速搭建 IM 系统。
开源IM即时通讯系统调研
|
7月前
|
移动开发 网络协议 小程序
鸿蒙NEXT即时通讯/IM系统RinbowTalk v2.4版发布,基于MobileIMSDK框架、ArkTS编写
RainbowTalk是一套基于开源即时通讯讯IM框架 MobileIMSDK 的产品级鸿蒙NEXT端IM系统。纯ArkTS编写、全新开发,没有套壳、也没走捷径,每一行代码都够“纯血”。与姊妹产品RainbowChat和RainbowChat-Web 技术同源,历经考验。
310 1
|
8月前
|
机器学习/深度学习 人工智能 自然语言处理
从0搭建AI智能客服教程(AI智能客服系统选型和实战指南)
针对智能客服技术与业务脱节的痛点,合力亿捷通过 NLP、知识图谱及人机协同策略,助企业实现首次解决率超 70%、人力成本降 43%、年省成本超千万。其方案提升制造业问题解决率 40%,投诉转接成功率达 99%,以分场景选型助力超万家企业平衡业务与成本,成行业首选。
|
8月前
|
缓存 移动开发 网络协议
纯血鸿蒙NEXT即时通讯/IM系统:RinbowTalk正式发布,全源码、纯ArkTS编写
RainbowTalk是一套基于MobileIMSDK的产品级鸿蒙NEXT端IM系统,目前已正式发布。纯ArkTS、从零编写,无套壳、没走捷径,每一行代码都够“纯”(详见:《RainbowTalk详细介绍》)。 MobileIMSDK是一整套开源IM即时通讯框架,历经10年,超轻量级、高度提炼,一套API优雅支持 UDP 、TCP 、WebSocket 三种协议,支持 iOS、Android、H5、标准Java、小程序、Uniapp、鸿蒙NEXT,服务端基于Netty编写。
588 1
|
8月前
|
移动开发 缓存 前端开发
可二次开发的在线客服系统-前后端混合渲染模式
服务端渲染(SSR)结合API交互,提升首屏加载速度与SEO友好性,适用于混合渲染模式的Web应用。
150 0
|
8月前
|
Kubernetes Go 数据库
客服系统命令行程序-Cobra 命令行应用入口
唯一客服系统是基于 Go 语言与 Cobra 框架构建的命令行工具,用于管理在线客服系统。支持启动、安装和停止服务,具备清晰的命令结构和良好的扩展性,便于维护与功能拓展。
189 0

热门文章

最新文章