我一直都有一个需求,就是可以很方便的将Socket传进来的二进制解析到具体的某个消息,每个消息都有自己的事件处理。之前有写过一个这样的,但是事件处理必须写在各个消息类里面,这样不是很好。现在借着C#的泛型协变的这个特性,做了一个强类型的事件分发器。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace FirBase
{class CDispatcherHelper{public static string GetKey<T>(){Type t = typeof(T);return t.Name;}}public interface ICallback<out T>{T GetData(byte[] data);void Exce(byte[] data);}public class CallBack<T> : ICallback<T>{private Action<T> _handle = null;public CallBack(Action<T> handle){_handle = handle;}public void Exce(byte[] data){var tData = GetData(data);exce(tData);}public T GetData(byte[] data){return SerializationHelper.BinaryDeSerialization<T>(data);}public void exce(T data){if (_handle != null){_handle(data);} }}public class Dispatcher{private Dictionary<string, ICallback<Object>> _callBackDic = new Dictionary<string, ICallback<Object>>();private ICallback<Object> _curCallBack = null;/// <summary>/// 注册消息/// </summary>/// <typeparam name="T"></typeparam>/// <param name="callback"></param>/// <returns></returns>public bool Reg<T>(ICallback<T> callback){_callBackDic[CDispatcherHelper.GetKey<T>()] = (ICallback<Object>)callback;return false;}/// <summary>/// 分发消息/// </summary>/// <param name="key"></param>/// <param name="data"></param>public void MsgDispatcher(string key, byte[] data){if (_callBackDic.TryGetValue(key, out _curCallBack)){_curCallBack.Exce(data);}}}
}

没有做多线程的处理

现在是例子,首先我们定义一个TestMsg,这个类必须是可序列化的。

    [Serializable]class TestMsg{public string aa;public string bb;}

然后我们要注册消息,并且设置消息的回调函数

    class MsgHandle{public MsgHandle(FirBase.Dispatcher dispatcher){dispatcher.Reg(new FirBase.CallBack<TestMsg>(OnTestMsg));}public void OnTestMsg(TestMsg msg){FirBase.FirLog.v(this, "aa=" + msg.aa + "bb=" + msg.bb);}}

然后在main函数中这样调用

            Dispatcher testDispatcher = new Dispatcher();MsgHandle handle = new MsgHandle(testDispatcher);

接下来,我们6秒后发送消息,这就需要用到之前造的轮子协程了。

发送消息的函数大概这样的:

        private static IEnumerator delaySendMsg(Dispatcher dispatcher){yield return new FirBase.WaitForSecond(new TimeSpan(0, 0, 6));TestMsg msg = new TestMsg();msg.aa = "haha";msg.bb = "heihei";dispatcher.MsgDispatcher(DispatcherHelper.GetKey<TestMsg>(), SerializationHelper.BinarySerialization(msg));}

然后协程的调用是这样的:

            FirTask.Instance.AddTask(delaySendMsg(testDispatcher));while(true){FirTask.Instance.DoTask();}

运行结果如下:

最后的最后,忘了说序列化那块了,调用的是C#自带的序列化函数,只是稍微包装了一下:

    public class SerializationHelper{/// <summary>/// 二进制序列化/// </summary>/// <typeparam name="T"></typeparam>/// <param name="data"></param>/// <returns></returns>public static byte[] BinarySerialization<T>(T data){byte[] bData = null;BinaryFormatter formatter = new BinaryFormatter();using (MemoryStream stream = new MemoryStream()){formatter.Serialize(stream, data);bData = stream.GetBuffer();}return bData;}/// <summary>/// 二进制反序列化/// </summary>/// <typeparam name="T"></typeparam>/// <param name="data"></param>/// <returns></returns>public static T BinaryDeSerialization<T>(byte[] data){T t;BinaryFormatter formatter = new BinaryFormatter();using (MemoryStream stream = new MemoryStream(data)){t = (T)formatter.Deserialize(stream);}return t;}}

demo在这里,这篇博客一最后

http://blog.csdn.net/nxshow/article/details/51067764

【UnityC#】写了一个事件分发器相关推荐

  1. cocos2d JS 自定义事件分发器(接收与传递数据) eventManager

    简而言之,它不是由系统自动触发,而是人为的干涉 较多情况用于传递数据 var _listener1 = cc.EventListener.create({event: cc.EventListener ...

  2. 师兄写的一个JAVA播放器的源代码(转)

    师兄写的一个JAVA播放器的源代码 MediaPlayer.java ----------------------------------------------------------------- ...

  3. 关于对 Unity 3D Strange IoC 框架事件分发器的认识

    ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ 关于事件分发器的认识 publi ...

  4. 【UE】事件分发器 正确使用方法 (如何创建 Bnd Evt Delegate Signature)

    事件分发器(Event Dispatch) 1. 创建Event Dispatch 打开蓝图类,左下角新建EventDispatch: 然后命名一下这个分发器.这里以UE5为例,UE4同理的. 命名为 ...

  5. UE4虚幻引擎关于事件分发器的使用!

    UE4虚幻引擎关于事件分发器的使用! 首先,这次就讲一下,事件分发器,在UI,Pawn,子actor如何进行事件传递! 首先!我们如果要使用事件分发器的原因是什么! 第一,肯定是方便,快! 第二,为了 ...

  6. (十三)事件分发器——event()函数,事件过滤

    事件分发器--event()函数 事件过滤 事件进入窗口之前被拦截 eventFilter #include "mywidget.h" #include "ui_mywi ...

  7. Unity事件分发器

    事件分发机制也被称之为事件监听派发系统,在每个游戏框架中都是不可或缺的一个模块.起作用主要是用来解耦,监听网络消息,或者做一些异步的操作等,下面是使用C#在Unity游戏开发中的事件分发处理机制的简单 ...

  8. java mplayer 源码_师兄写的一个JAVA播放器的源代码

    MediaPlayer.java ---------------------------------------------------------------------------- //程序主文 ...

  9. QT + OpenGL + FFmpeg写的一个全景视频播放器

    临时被分配了一个任务 写一个C++版本的全景视频播放器 网上搜了搜  基于前辈的基础上 写的差不多了 测试视频源是用ffmpeg拉RTSP的流 最终是要嵌入到别的一个视频播放器模块 所以解码这块我不用 ...

最新文章

  1. 使用jquery 根据下拉列表的name值查找被选中的值
  2. Spring与Hibernate两种组合方式
  3. Jenkins deploy to container部署war到tomcat(学习笔记十六)
  4. MSSQL-SQL SERVER 分页原理
  5. 多任务 schedule python_Python3.6 Schedule 模块定时任务 (实例讲解)
  6. 【Elasticsearch】为Elasticsearch启动https访问
  7. 干货分享,我是怎么寻找暴利赚钱项目的
  8. mysql模糊查询 or_mysql 模糊查询 - yizhichao的个人页面 - OSCHINA - 中文开源技术交流社区...
  9. 给员工授予svn相关权限
  10. linux停止tomcat为什么要kill其掉进程 而不是直接shutdown.sh
  11. Ubuntu下安装stlink-v2驱动
  12. 人工智能无线通信应用的一些论文
  13. dwcs6中php为什么浏览不了,dreamweaver CS6编辑浏览器列表无法添加浏览器的解决处理...
  14. 【数据库】imp-00015
  15. 用python处理excel文件_python处理Excel文件
  16. CAD建筑制图入门加老虎窗
  17. mysql 留存率_mysql查询用户留存语法(用户留存和用户留存率问题)
  18. 蔡先生论道大数据之一 : 大数据由来
  19. 地图导航开启蓝牙后无导航语音
  20. 电阻网络法DAC分析

热门文章

  1. 国防科大计算机学院吕品,国防科技大学徐明教授访问重点实验室
  2. nexus5 android7 root,nexus 5/5x/6/6p/7/9 安卓8/7/6.0.1一键root办法
  3. Linux:使用ulimit设置文件最大打开数
  4. linux 拍照的软件,六款优秀的Linux照片管理软件
  5. 一个人不成熟,有三大表现
  6. Android系统的图标设计规范
  7. 晨曦记账本记账,使用项目查看账目
  8. SaaS模式在国内的基本现状研究
  9. AN/APG-68雷达空对空雷达模式
  10. js textarea换行