前面的文章已经介绍完了基于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 源码

一个简单的IM系统(Demo附源码)-- ESFramework 4.0 快速上手(08)的更多相关文章

  1. Android UI开发: 横向ListView(HorizontalListView)及一个简单相册的完整实现 (附源码下载)

    http://blog.csdn.net/yanzi1225627/article/details/21294553 原文

  2. 聊天系统Demo,增加文件传送功能(附源码)-- ESFramework 4.0 快速上手(14)

    本文我们将介绍在ESFramework 4.0 快速上手(08) -- 入门Demo,一个简单的IM系统(附源码)的基础上,增加文件传送的功能.如果不了解如何使用ESFramework提供的文件传送功 ...

  3. 聊天系统Demo,增加Silverlight客户端(附源码)-- ESFramework 4.0 快速上手(09)

    在ESFramework 4.0 快速上手 -- 入门Demo,一个简单的IM系统(附源码)一文中,我们介绍了使用ESFramework的Rapid引擎开发的winform聊天程序,本文我们将在之前d ...

  4. Java开发简单的家居购物商城系统 JSP 附源码

    开发环境:    Windows操作系统开发工具: MyEclipse+Jdk+Tomcat+MYSQL数据库 注意:使用tomcat7运行 运行效果图 源码及原文链接:https://javadao ...

  5. 急急如律令!火速搭建一个C#即时通信系统!(附源码分享——高度可移植!)

    (2016年3月更:由于后来了解到GGTalk开源即时通讯系统,因此直接采用了该资源用于项目开发,在此对作者表示由衷的感谢!) —————————————————————————————————— 人 ...

  6. 使用微软企业库5.0提供的unity配置解藕系统demo(源码)

    最近公司集50多号开发人员的人力围绕一个系统做开发,框架是免不了要统一的,公司提供的架构,利于分工合作,便于维护,扩展,升级,其中使用了到微软的企业库来解藕系统,只是因为框架封装,于是在网上学习了一个 ...

  7. 【游戏开发&Unity】捏脸系统(附源码)

    本着“没有捏脸系统算什么RPG”的想法,着手做一个2d简易捏脸demo.其实换装游戏都差不多啦~ github代码地址:Simple-Character-Edit-System (Unity版本:5. ...

  8. Android Studio 一个完整的APP实例(附源码和数据库)

    前言: 这是我独立做的第一个APP,是一个记账本APP. This is the first APP, I've ever done on my own. It's a accountbook APP ...

  9. 教你用纯Java实现一个网页版的Xshell(附源码)

    前言 最近由于项目需求,项目中需要实现一个WebSSH连接终端的功能,由于自己第一次做这类型功能,所以首先上了GitHub找了找有没有现成的轮子可以拿来直接用,当时看到了很多这方面的项目,例如:Gat ...

随机推荐

  1. 使用pycharm+pyqt5 调取界面程序

    一.使用QtDesigner制作界面 1)打开的界面设计工具QtDesigner,如图: 2)新建窗体,选择Main Window: 3)分别在窗口添加如下控件,Calendar.3个pushButt ...

  2. sql第三天

    ->完整的select语句及执行顺序(必须记住) 5...select 5.2->distinct 7...top n [percent] 5.1->列名 聚合函数(1.2-> ...

  3. Android开源库loopj的android-async-http的 JsonHttpResponseHandler 存在死循环GC_CONCURRENT

    我现在用的是 AndroidAsyncHttp 1.4.4 版本,之前遇到一个很奇怪的问题, 当使用 JsonHttpResponseHandler 解析请求的页面出现服务器错误或其他情况返回的内容不 ...

  4. VS2010下编译sqlite3

    首先下载源码,http://www.sqlite.org/download.html中第一个下载文件就是,下载sqlite-amalgamation-3071000.zip,当前版本是3.7.10,里 ...

  5. C#中string的小结

    C#中的string类型明确定义为引用类型,但是使用时常常表现出数值型的特性.最典型的例子就是交换字符串. public static void stringexchange(string a, st ...

  6. List集合对象中的排序,随机显示

    List<User> students = new ArrayList<User>(); User user1 = new User(); user1.setAge(112); ...

  7. 关于jq的load不用回调获取其中dom元素方法

    jq的load方法如果要操作其中的dom元素,需要使用回调,等其加载完了再进行dom元素的获取,今天看我们项目组长写的一段代码,发现不用回调也能获取到其中的元素. 具体是这样写的: <scrip ...

  8. C# 常用接口学习 ICollection<T>

    C# 常用接口学习 ICollection<T> 作者:乌龙哈里 时间:2015-11-01 平台:Window7 64bit,Visual Studio Community 2015 参 ...

  9. 在Table的Tbody中实现滚动条滚动

    功能描述: 在一个Table中实现表头固定不动,内容部分实现通过滚动条滚动. 实现效果: 当页面宽度变宽时,只有最后一列的宽度会改变. 逻辑实现: 1.将表头和内容分别使用两个table标签包裹,每一 ...

  10. 找回误删除的UBUNTU16.04桌面壁纸图片,或把桌面背景图片另存。20170114

    今天遇到一个小问题,之前下载并设置为桌面壁纸的一张图片在整理文件的时候不小心删除了.由于想不起来当时从哪里找到的图,所以就想把当前桌面壁纸重新保存.经网上查询,未见正确的保存方法,故写在此处备忘. 1 ...