如何使用自定义消息?--ESFramework 4.0 快速上手(04)
在ESFramework 4.0 快速上手一文中,我们讲述了如何使用Rapid引擎可以快速地上手ESFramework开发,文中介绍了使用ESPlus.Application.CustomizeInfo命名空间下的类可以发送和处理自定义消息,本文我们就通过一个简单的例子来深入讲解如何使用自定义消息。
例子的场景很简单:假设客户端登陆到服务器之后,要求请求加入某个组,服务端收到该请求后,处理该请求,并给客户端相应的回复 -- 是否加入成功,客户端收到回复后,即可作出相应的处理。
一.定义消息类型和消息协议Contract
这个场景涉及到两种类型的消息:请求加入组(客户端发给服务器),加入组的结果(服务器回复给客户端)。于是,我们可以定义这两个消息类型:
public static class InformationTypes
{
/// <summary>
/// 请求加入组 Client =》 Server 。对应的消息体为 JoinGroupContract
/// </summary>
public const int JoinGroup = 1; /// <summary>
/// 加入组的结果 Server =》 Client 。对应的消息体为 JoinGroupResultContract
/// </summary>
public const int JoinGroupResult = 2;
}
另外,我们可以客户端发给服务器的请求以及服务器给客户端的回复分别用协议类JoinGroupContract和JoinGroupResultContract封装起来:
[Serializable]
public class JoinGroupContract
{
public JoinGroupContract() { }
public JoinGroupContract(string _groupID, string _groupPwd)
{
this.groupID = _groupID;
this.groupPwd = _groupPwd;
} #region GroupID
private string groupID = "";
/// <summary>
/// 请求加入组的ID
/// </summary>
public string GroupID
{
get { return groupID; }
set { groupID = value; }
}
#endregion #region GroupPwd
private string groupPwd = "";
/// <summary>
/// 请求加入组的密码
/// </summary>
public string GroupPwd
{
get { return groupPwd; }
set { groupPwd = value; }
}
#endregion
} [Serializable]
public class JoinGroupResultContract
{
public JoinGroupResultContract(){}
public JoinGroupResultContract(bool _succeed)
{
this.succeed = _succeed;
} #region Succeed
private bool succeed = true;
/// <summary>
/// 加入组是否成功
/// </summary>
public bool Succeed
{
get { return succeed; }
set { succeed = value; }
}
#endregion
}
当然,这里的协议类非常简单,而对于我们实际的应用,协议类中封装很多的信息都是可以的。
二.客户端向服务器发送请求
好了,客户端在引擎初始化成功之后,就可以向服务器发送加入组G001的请求了:
//向服务器请求 加入G100组
JoinGroupContract JoinGroupContract = new JoinGroupContract("G100", "123456");
rapidPassiveEngine.CustomizeInfoOutter.Send(InformationTypes.JoinGroup, ESBasic.Helpers.SerializeHelper.SerializeObject(JoinGroupContract));
三.服务器处理请求,并发送回复给客户端
服务端通过实现ESPlus.Application.CustomizeInfo.Server.ICustomizeInfoBusinessHandler接口的HandleInformation方法来处理该请求:
private ICustomizeInfoController customizeInfoController = ......;
//服务端处理消息
public void HandleInformation(string sourceUserID, int informationType, byte[] info)
{
if(informationType == InformationTypes.JoinGroup)
{
JoinGroupContract joinGroupContract = (JoinGroupContract)ESBasic.Helpers.SerializeHelper.DeserializeBytes(info, 0, info.Length);
string groupID = joinGroupContract.GroupID;
// ........ (逻辑处理) JoinGroupResultContract resContract = new JoinGroupResultContract(true) ;//同意加入
//向用户发送回复消息
this.customizeInfoController.Send(sourceUserID, InformationTypes.JoinGroupResult, SerializeHelper.SerializeObject(resContract));
return;
}
}
四.客户端处理服务器的回复
接下来,客户端也可以通过实现ESPlus.Application.CustomizeInfo.Passive.ICustomizeInfoBusinessHandler接口的HandleInformationFromServer方法来处理服务器的回复:
//客户端处理消息
public void HandleInformationFromServer(int informationType, byte[] info)
{
if (informationType == InformationTypes.JoinGroupResult)
{
JoinGroupResultContract resContract = (JoinGroupResultContract)SerializeHelper.DeserializeBytes(info, 0, info.Length);
if (resContract.Succeed)
{
//...... 加入成功了,呵呵
}
return;
}
}
这个demo简单地演示了消息类型的定义、协议类的定义、以及客户端向服务器发送请求、服务器处理请求并回复客户端的一个完整的处理流程。通过自定义消息,我们可以在服务端与客户端之间实现非常复杂的协作。所以,哪怕是使用ESFramework的快速引擎,我们也可以做很多很复杂的事情了。
有一点要特别注意,那就是尽可能使消息的尺寸小,在相同的频率下,消息越小,通信的效率越高。在本文的demo中,我们采用的是.NET自带的二进制序列化器将协议对象转化为byte[],而使用这个序列化器,所得到的byte[]通常都非常大,而消息越大,将使得服务端与客户端通信的负担增大。所以,如果有自己更好更简洁的序列化方式,建议不要采用.NET自带的二进制序列化器。
如何使用自定义消息?--ESFramework 4.0 快速上手(04)的更多相关文章
- ESFramework 4.0 快速上手(06) -- Rapid引擎(续)
<ESFramework 4.0 快速上手>系列介绍的都是如何使用Rapid引擎(快速引擎) -- RapidServerEngine 和 RapidPassiveEngine.其实,大家 ...
- 聊天系统Demo,增加文件传送功能(附源码)-- ESFramework 4.0 快速上手(14)
本文我们将介绍在ESFramework 4.0 快速上手(08) -- 入门Demo,一个简单的IM系统(附源码)的基础上,增加文件传送的功能.如果不了解如何使用ESFramework提供的文件传送功 ...
- 聊天系统Demo,增加Silverlight客户端(附源码)-- ESFramework 4.0 快速上手(09)
在ESFramework 4.0 快速上手 -- 入门Demo,一个简单的IM系统(附源码)一文中,我们介绍了使用ESFramework的Rapid引擎开发的winform聊天程序,本文我们将在之前d ...
- 离线消息如何实现?-- ESFramework 4.0 快速上手(02)
在ESFramework 4.0 快速上手一文中,主要介绍了如何使用ESPlus.Rapid命名空间中的引擎来快速地构建基于TCP的网络通信系统,即使是使用ESPlus.Rapid来进行ESFrame ...
- ESFramework 4.0 快速上手(01) -- Rapid引擎
(在阅读该文之前,请先阅读 ESFramework 4.0 概述 ,会对本文的理解更有帮助.) ESFramework/ESPlatform 4.0 的终极目标是为百万级的用户同时在线提供支持,因为强 ...
- 客户端登录验证 -- ESFramework 4.0 快速上手(15)
在之前版本的Rapid引擎中,是没有提供客户端登陆验证的机制的,如果要验证用户的帐号密码信息,我们只有自己手动通过自定义信息来实现.在2011.04.25发布的新版本中,客户端Rapid引擎,则内置了 ...
- 文件传送,如此简单--ESFramework 4.0 快速上手(13)
在所有的通信系统中,文件传送是最常见也是最重要的功能之一,ESFramework对文件传送的强大支持也是其亮点之一,使用ESFramework可以非常轻松地实现与文件传送相关的所有需求.ESPlus. ...
- 使用紧凑的序列化器,数倍提升性能 —— ESFramework 4.0 快速上手(11)
在分布式通信系统中,网络传递的是二进制流,而内存中是我们基于对象模型构建的各种各样的对象,当我们需要将一个对象通过网络传递给另一个节点时,首先需要将其序列化为字节流,然后通过网络发送给目标节点,目标节 ...
- 监控自定义信息 —— ESFramework 4.0 快速上手(10)
在ESFramework 4.0 进阶(02)-- 核心:消息处理的骨架流程一文中,我们介绍了通过挂接IMessageSpy到骨架流程,我们就可以监控到所有收发的消息.由于Rapid引擎已经为我们组装 ...
随机推荐
- Defraggler(磁盘整理软件) V2.21.993 绿色版
软件名称: Defraggler(磁盘整理软件) 软件语言: 简体中文 授权方式: 免费软件 运行环境: Win 32位/64位 软件大小: 5.0MB 图片预览: 软件简介: Defraggler ...
- 【IE6的疯狂之八】链接伪类(:hover)CSS背景图片有闪动BUG
IE6下链接伪类(:hover)CSS背景图片有闪动BUG,主要原因ie会再一次请求这张图片,或者说图片没被缓存. 例如: CSS代码 a:hover{background:url(imagepath ...
- 浅谈html入门
一. 学习web前端开发基础技术需要掌握:HTML.CSS.JavaScript语言.下面就来了解下这三门技术都是用来实现什么的:1. HTML是网页内容的载体.内容就是网页制作者放在页面上想要让用户 ...
- Python学习笔记——基础篇【第七周】———FTP作业(面向对象编程进阶 & Socket编程基础)
FTP作业 本节内容: 面向对象高级语法部分 Socket开发基础 作业:开发一个支持多用户在线的FTP程序 面向对象高级语法部分 参考:http://www.cnblogs.com/wupeiqi/ ...
- jsp:useBean的使用
->Bean的基本要素: 1.必须要有一个不带参数的构造器,在jsp元素创建Bean时会调用空构造器 2.Bean类应该没有任何公共实例变量,也就是说,不允许直接访问实例变量,通过setter/ ...
- TypeScript 学习一 参数,函数,析构表达式
1,TypeScript是由谷歌开发的,并且新出的Angular2框架就是谷歌公司由TypeScript语言编写的,所以现在TypeScript是有微软和谷歌一起支持的: 2,TypeScript在j ...
- 4天html总结
- php笔记(五)PHP类和对象之对象的高级特性
对象比较,当同一个类的两个实例的所有属性都相等时,可以使用比较运算符==进行判断,当需要判断两个变量是否为同一个对象的引用时,可以使用全等运算符===进行判断. class Car { } $a = ...
- Spring.net 学习IOC------准备
在学习spring.net开始时,我们首先要下载spring.net所用到的类库: Common.Logging.dll(必要)Spring.Core.dll(必要)Spring.Data.dllSp ...
- electron的艰难安装之旅
最近对前端开发很感兴趣,抽空研究了下前段的开发工具,发现比较流行的是sublime,atom,vscode等, 由于一直以来从事.net开发所以对vscode很感兴趣,在vscode的安装配置过程偶然 ...