Beetle.SL给Silverlight提供了WCF以外的基于对象传送的Socket tcp传输功能,虽然提供了对象来描述协议但如果对其协议的封不了解那似乎和其他平台进行网络通过就比较麻烦了。虽然Beetle.SL是以对象的方式来描述协议,但其灵活度非常的高。以常见的头4字节描述消息长度为例,组件可以通过对象对现有这种协议进行描述,并通过组件进行对象信息交互。在这里介绍如何使用头4节字描述长度的分析器来进行协议分析和获取。HeadSizePackage只是一个抽象类,如果需要使用它来进行分析协议必须继承它并现实两个方法.

  • protected abstract IMessage ReadMessageByType(BufferReader reader,out object typetag);
  • protected abstract void WriteMessageType(IMessage msg, BufferWriter writer);

这两个方法分别是写入消息的时候如何写入消息类型标记和在读取消息的时候如何获取标记并根据标记来创建相关的信息对象.以下是一个简单的以类的类型名称作为一个标记写入和读取

    public class HeadSizePackage:Beetle.HeadSizeOfPackage{protected override Beetle.IMessage ReadMessageByType(Beetle.BufferReader reader, out object typetag){typetag = reader.ReadString();switch ((string)typetag){case "User":return new User();default:return null;}}protected override void WriteMessageType(Beetle.IMessage msg, Beetle.BufferWriter writer){if (msg is User){writer.Write(msg.GetType().Name);}else{writer.Write("NULL");}}}

以上对象标记处理很简单,如果对象是User就写入类型名称,如果没有配匹就写入一个NULL字符,同样读取的时候如果是标记是User则创建一个User对象返回,这样一个简单协议分析器就定义完成;但这里并没有体现出HeadSizePackage是怎样把对象写入数据流或从流中读取信息。下面通过一个简单对象来详细描述这一点.

    public class User:Beetle.IMessage{public string Name;public string Email;public void Load(Beetle.BufferReader reader){Name = reader.ReadString();Email = reader.ReadString();}public void Save(Beetle.BufferWriter writer){writer.Write(Name);writer.Write(Email);}}

这是一个很简单的User信息,分另有两个成员Name和EMail.当Channel通过HeadSizePackage进行数据写入的时候会一个怎样的格式呢。首先我们实例一个对象并设置相关值.

            User user = new User();user.Name = "henry";user.Email = "henryfan@msn.com";

通过HeadSizePackage处理后得到的byte[]十六进制信息如下:

2900000004000000557365720500000068656E72791000000068656E727966616E406D736E2E636F6D

接下来通过一个详细的图解来描述这个消息的组成结构:

以上只是HeadSizePackage的一种处理情况,协议的制定有很多种方式。有些情况已有的协议已经存在,那不可能修改它来适应现有的。因此HeadSizePackage提供了足够的灵活性能适应这一点。以下是一个以int为消息标记的实现。

    public class HeadSizePackage:Beetle.HeadSizeOfPackage{protected override Beetle.IMessage ReadMessageByType(Beetle.BufferReader reader, out object typetag){typetag = reader.ReadInt32();switch ((int)typetag){case 1:return new User();default:return null;}}protected override void WriteMessageType(Beetle.IMessage msg, Beetle.BufferWriter writer){if (msg is User){writer.Write(1);}else{writer.Write(-1);}}}

同样的消息生成的协议内容会是如下:

25000000010000000500000068656E72791000000068656E727966616E406D736E2E636F6D

通过详细图解来描述这个结构:

实际情况比较多,这里只是简单地描述两种情况,通过组件提供BufferWriter和BufferReader方法足够满足实际情况的需要,以上两个对象的方法详解可以查看:Beetle.SL BufferReader,BufferWriter

在新版的Beetle.SL中集成了数值可变长度写入,可以更好节省带宽资源详细看:http://beetlesl.codeplex.com/

转载于:https://www.cnblogs.com/smark/archive/2012/05/02/2478495.html

Beetle.SL对象封装协议详解相关推荐

  1. Trunk的封装协议详解

    trunk封装协议--802.1Q和ISL 802.1Q: 公有标准协议,支持标准VLAN和扩展VLAN的标记,仅添加4个字节,破坏了数据帧的原有格式,需要重新进行FCS校验,同时增加CPU的负荷和开 ...

  2. RTMP协议封装H264和H265协议详解

    RTMP协议封装H264和H265协议详解 文章目录 RTMP协议封装H264和H265协议详解 1 RTMP和FLV 2 RTMP协议封装H264视频流 2.1 RTMP发送AVC sequence ...

  3. 《TCP IP协议 详解》思考总结 · 三

    前言 这一篇文章主要围绕了IP协议,ICMP协议和UDP协议展开,希望可以在这里大概做一个总结,将<TCP/IP协议详解 卷一>书中TCP相关章节前面的内容做一个结束,在下一篇文章专心的去 ...

  4. 浏览器对象存储数据详解

    浏览器对象存储数据详解 前言 随着需求的发展,浏览器的功能正变的越来越强大,在本地存储数据可以极大的方便人们进行各种操作,如localStroage/sessionStroage等,下面我就记录在项目 ...

  5. WebSocket协议详解及应用

    标签:websocket WebSocket协议详解及应用(七)-WebSocket协议关闭帧 本篇介绍WebSocket协议的关闭帧,包括客户端及服务器如何发送并处理关闭帧.关闭帧错误码及错误处理方 ...

  6. 最详细的流媒体传输协议-rtsp协议详解

    流媒体传输协议-rtsp协议详解 参阅:RTSP协议详解和分析从零开始写一个RTSP服务器(一)RTSP协议讲解关于RTSP_RTP_RTCP协议的深刻初步介绍 rtsp RTSP出现以前,最热的大概 ...

  7. 组播及igmp/mld协议详解(一)

    组播和IGMP的作用 --------------------------------- 所谓组播,与单播和广播相对,是指将网络主机将一次将数据发给多个属于同一组的目标主机.主要使用了IGMP协议. ...

  8. RTSP、HTTP、HTTPS、SDP四种协议详解

    RTSP.HTTP.HTTPS.SDP四种协议详解 从这篇开始我们将进入流媒体的环节,流媒体在android中有nuplayer来实现的,在开始讲解android流媒体前,我们先来讲讲流媒体传输协议, ...

  9. 思科ccna认证工程师NETCONF协议详解网工必看

    思科ccna认证工程师NETCONF协议详解网工必看,这些年随着SDN的热潮,一个诞生了十年之久的协议再一次引起了人们的重视,它就是NETCONF协议. 网络配置协议NETCONF(Network C ...

最新文章

  1. 排序算法大集锦_合并排序_1(分治思想)
  2. 【安卓开发 】Android初级开发(十一)Android中多线程
  3. 用html编写你好,02 - HTML5第一个项目:HelloWorld!(收藏)
  4. Learning to Refine Object Segments
  5. 子元素应该margin-top为何会影响父元素【转】
  6. 拓端tecdat|用R语言模拟混合制排队随机服务排队系统
  7. 大学生搜题软件哪个好?2020搜题软件排行榜
  8. CodeSmith介绍
  9. 高德地图-根据IP定位显示当前所在城市
  10. 利用LM317的LED恒流源电路图
  11. 关于sematic segmentation的几篇论文(二)
  12. gradle系列-1-gradle -x test clean build
  13. 以太网UDP协议讲解
  14. DeleteRow()
  15. 如何有效提高生产车间的生产效率呢?
  16. 主题 12:实践案例集锦之兜底方案设计
  17. Android 应用开发入门
  18. 深度理解矩阵的奇异值,特征值
  19. 电子计算机与多媒体课件背景,《多媒体CAI课件制作》教学课件(全套).ppt
  20. XCode官方直接下载地址

热门文章

  1. 轴风扇和离心风扇--有什么区别?
  2. STM32G431-基于HAL库(第十四届蓝桥杯嵌入式模拟题2)
  3. 内卷?谈谈成为AI算法大牛的职业发展
  4. extends 与 implements 的区别 !
  5. 事件绑定(onmouseout,onmouseover)
  6. 为什么乔布斯最欣赏扎克伯格?
  7. 【教学类-26-01】背诵家长电话号码-Python数字填空(中班 偏数学和社会)
  8. docker 开始容器_我是如何开始使用docker的,为什么也应该使用
  9. 【程序】在STM32单片机上实现基于LwIP 2.1.3协议栈raw API的DHCP服务器,为其他设备分配IPv4地址(20220122版)
  10. 基于yolov5和AIdLux的人流统计代码实现