我的IM - 基础篇[3] - 基于UDP通讯的IM设计[基于XML格式的网络通讯协议 以及 包解析器和包处理器的基础概念]

转载 2011年01月10日 18:05:00

呵呵 对于我的基础篇[2],我看到有很多朋友很感兴趣,而且有几位朋友提出了很好的意见,呵呵在本次开篇前,我先回应下,

我先讲解下基础的知识,至于朋友们说的东西都会在后面讲到,呵呵别着急,谢谢你们的建议了。

 

上次我们说到了一个已经被改过多次的协议,我们来回顾下:

 

 

  哦,就是这个了,本次的讲解是先要讲述基于XML的通讯协议,然后了解下包解析器和包处理器的基础概念,那么我们开始!

  XML,是可扩展标记语言,自然的,扩展性能很好,大家也许看到了我上面这个红色的自定义协议不好了,为什么呢?

最大的弊端就是,如果我的内容多了,就需要很多分隔符。这个问题也就是很多人在网上发帖问到的,怎么分割命令?

      呵呵 那么我继续改造我们的命令,我先直接给出成型的通用通讯协议,然后再给大家介绍(我给出的是最通用的,先不包含包序列号等):

  <Protocol><USERNAME="用户名" PASSWORD="密码" PROTOCOL="0" COMMAND="0" SENDTIME="发送时间" HASHCODE=“唯一码” ISEND="是否结束" ACK="回馈标示" ENCRYPT=“加密标示”></Protocol>

  这个就是更改后的了,很简单,我来带大家了解下,我们使用了XML语言对我们原有的网络自定义命令,进行包装,这样而来,我们的好处很多:

  1. 便于解析(后面会讲到,这个是重点,而且还跟一个重要的概念有关[缓冲池])

  2. 分隔符少,难道不是吗? 呵呵 可能有人又要问我了,如果我的密码之中就有双引号那怎么办?那岂不是拆分的时候要乱套了?

呵呵 ,对于这样的话,我们有2种初步方案进行改造,对于内容部分(被双引号括起来的部分),

  (1) 就是将内容部分中所有双引号进行替换,比如讲双引号替换成 @/*/@

   (2)   就是将内容部分进行2进制转换。

呵呵,总之不管用什么方法,都能够解决以上这点小问题,那么有人问了,你的XML协议只有这个点东西,如果我还要加入用户的等级啊,什么的

岂不是每次我都要用字符串进行拼接,很麻烦?

       呵呵 对于上述问题,我的解答是,做一个自己的协议工厂,每个协议的共同部分由协议工厂加工,其余的你只需要给出具体的内容即可。

呵呵 ,我这里给出我的初期小型协议工厂代码:

 


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ProtocolFactory
{
    
public class ProtocolFactory
    {
        
/// <summary>
        
///     创建协议
        
/// </summary>
        
/// <param name="TYPE" type="string">
        
///     <para>
        
///         类别
        
///     </para>
        
/// </param>
        
/// <param name="COMMAND" type="string">
        
///     <para>
        
///         命令类型
        
///     </para>
        
/// </param>
        
/// <param name="PROTOCOL" type="string">
        
///     <para>
        
///         命令协议簇
        
///     </para>
        
/// </param>
        
/// <param name="PackageBody" type="string">
        
///     <para>
        
///         主体数据
        
///     </para>
        
/// </param>
        
/// <param name="ack" type="ProtocolFactory.ProtocolFactory.ACK">
        
///     <para>
        
///         回馈标示
        
///     </para>
        
/// </param>
        
/// <param name="encrypt" type="ProtocolFactory.ProtocolFactory.ENCRYPT">
        
///     <para>
        
///         加密标示
        
///     </para>
        
/// </param>
       
/// <param name="DIC_USERINFO">
        
///     <para>
        
///         自身基础会话码
        
///     </para> 
       
/// </param>
        
/// <returns>
        
///     返回完整协议
        
/// </returns>
        public static String GetProtocol(String TYPE, int COMMAND, String PROTOCOL, String PackageBody, ACK ack, ENCRYPT encrypt, String SessionCode)
        {
            String Protocl 
= "<Protocol><TYPE=/"" + TYPE + "/" ";
            Protocl 
+= "COMMAND=/"" + COMMAND + "/" ";
            Protocl 
+= "PROTOCOL=/"" + PROTOCOL + "/" ";
            Protocl 
+= "SENDTIME=/"" + DateTime.Now.ToShortDateString() + "/" ";
            
if (SessionCode != null)
            {
                Protocl 
+= "SESSIONCODE=/"" + SessionCode + "/" ";
            }

            
if (ack == ACK.No)
            {
                Protocl 
+= "ACK=/"0/" ";
            }
            
else
            {
                Protocl 
+= "ACK=/"1/" ";
            }
            
if (encrypt == ENCRYPT.No)
            {
                Protocl 
+= "ENCRYPT=/"0/" ";
            }
            
else
            {
                Protocl 
+= "ENCRYPT=/"1/" ";
            }
            Protocl 
+= PackageBody.Replace("/"""*@^@*");
            Protocl += "></Protocol>";
            
return Protocl;
        }

        
/// <summary>
        
///     创建协议
        
/// </summary>
        
/// <param name="TYPE" type="string">
        
///     <para>
        
///         类别
        
///     </para>
        
/// </param>
        
/// <param name="COMMAND" type="string">
        
///     <para>
        
///         命令类型
        
///     </para>
        
/// </param>
        
/// <param name="PROTOCOL" type="string">
        
///     <para>
        
///         命令协议簇
        
///     </para>
        
/// </param>
        
/// <param name="PackageBody" type="string">
        
///     <para>
        
///         主体数据
        
///     </para>
        
/// </param>
        
/// <param name="ack" type="ProtocolFactory.ProtocolFactory.ACK">
        
///     <para>
        
///         回馈标示
        
///     </para>
        
/// </param>
        
/// <param name="encrypt" type="ProtocolFactory.ProtocolFactory.ENCRYPT">
        
///     <para>
        
///         加密标示
        
///     </para>
        
/// </param>
        
/// <returns>
        
///     返回完整协议
        
/// </returns>
        public static String GetProtocol(String TYPE, int COMMAND, String PROTOCOL, String PackageBody, ACK ack, ENCRYPT encrypt)
        {
            String Protocl 
= "<Protocol><TYPE=/"" + TYPE + "/" ";
            Protocl 
+= "COMMAND=/"" + COMMAND + "/" ";
            Protocl 
+= "PROTOCOL=/"" + PROTOCOL + "/" ";
            Protocl 
+= "SENDTIME=/"" + DateTime.Now.ToShortDateString() + "/" ";

            
if (ack == ACK.No)
            {
                Protocl 
+= "ACK=/"0/" ";
            }
            
else
            {
                Protocl 
+= "ACK=/"1/" ";
            }
            
if (encrypt == ENCRYPT.No)
            {
                Protocl 
+= "ENCRYPT=/"0/" ";
            }
            
else
            {
                Protocl 
+= "ENCRYPT=/"1/" ";
            }
            Protocl 
+= PackageBody.Replace("/"""*@^@*");
            Protocl += "></Protocol>";
            
return Protocl;
        }

        
/// <summary>
        
///     回馈标示
        
/// </summary>
        public enum ACK
        {
            
/// <summary>
            
///     需要回馈
            
/// </summary>
            Yes,
            
/// <summary>
            
///     不需要回馈
            
/// </summary>
            No
        }

        
/// <summary>
        
///     加密标示
        
/// </summary>
        
/// <remarks>
        
///     
        
/// </remarks>
        public enum ENCRYPT
        {
            
/// <summary>
            
///     需要加密
            
/// </summary>
            Yes,
            
/// <summary>
            
///     不需要加密
            
/// </summary>
            No
        }
    }
}
 
 
对于我的协议工厂,只有一个字段需要解释,那就是"TYPE",对于此字段,我给出的解释就是,为了命令以下级别提供描述。
呵呵 不理解吗? 没关系的。以后会讲解出来,到时候就知道好处咯。
 
这样的话,每次发送这个由命令工厂制造出来的XML协议就可以了,(如果很大,将会分包,后期讲解,敬请期待)
 
 
那么我们现在来了解下 接下来的一些概念,在IM的OOP中,存在着2个类,分别叫"包解析器","包处理器"
这是2个基类,他们提供了所有包解析器和处理器的基础操作。
 
我们在原来的讲解中,说过,一个IM需要多个协议簇,因此呢,为了每个协议,就要开专门端口进行监听此协议,
那得到了发过来的信息后,如何解析呢?如何处理呢?这就要用到解析器,和处理器了。
  在IM通讯中,包 - 是最小的单位。也就是说包(Package)这个类是所有包的基类,不管你是输入包还是输出包。
不管你是什么协议的输出包,还是什么协议的输入包,都一样(对于包层次结构的详细讲解,下次将会讲述)。
  那么好了,我们就要为每个不同的协议簇产生对于这个协议簇的专门解析器和处理器,这是绝对的,也是必须的。
当我们为一个协议簇构建了单门的解析器和处理器后,我们就要使用它,怎么使用呢?安装它!
 
  下面是关于我的IM UML图中包解析器和包处理器的部分:
  
那么元接口给出了,大家就要自己些抽象基类,然后按照每个不同的协议派生出自己的解析器和处理器
比如,BASE协议的解析器和处理器呢就是: BaseProtocolParser , BaasePacketListener
 
呵呵 大家可以看后尝试做下,这样做的好处是什么呢?
那么我门继续看。
 
下面是我UML 框架图中,关于存放解析器和处理器的2大类
 
 
 
 
请注意其中的 InstallProcessor()方法 和 InstallParser()方法
呵呵 大家是否开始构思关于这款的详细结构了呢? 安装器所在的类我都已经给出了,大家可以尝试下?
 
那么下次还是打下伏笔,下次讲解的题目是:我的IM - 基础篇[4] - 输入/输出包的概念
 
后面的讲解将会非常精彩,敬请关注

相关文章推荐

网络通讯协议简介(网络基础)

通信协议:HTTP、TCP、UDP TCP   HTTP   UDP: 都是通信协议,也就是通信时所遵守的规则,只有双方按照这个规则“说话”,对方才能理解或为之服务。 TCP   H...

udp网络通讯协议demo

  • 2012年02月10日 08:41
  • 4KB
  • 下载

几种网络通讯协议概念

  • 2009年05月10日 23:04
  • 39KB
  • 下载

(IM)即时通讯协议

转载自点击打开链接 1、即时通讯技术 即时通讯(IM:Instant Messaging):又称实时通讯,支持用户在线实时交谈,允许两人或多人使用网络实时的传递文字消息、文件、语音与视频交流。 ...
  • jacksBO
  • jacksBO
  • 2017年04月05日 11:35
  • 1310

【黑马程序员】Java基础12:UDP和TCP的网络通讯

------- android培训、java培训、期待与您交流!---------- 一、网络通讯概述 网络通讯三要素: 1、IP地址:每台主机都有一个唯一的标识,即IP地址;每台计算机都有一个...

游戏开发中网络通讯协议对比

在网络游戏开发中,通讯协议是一个无法被避免的问题,无论对于客户端开发中还是服务器开发程序猿而言,制定一个合适的通讯协议是很有必要的 游戏联网需求有弱联网游戏,即时互动类游戏 选择通讯协议的时候主要关注...

EtherCAT 实时以太网络通讯协议

在百度上搜到,放到此处学习。Ethercat主张"以太网控制自动化技术" 。 它是一个开放源代码,高性能的系统,目的是利用以太网协议(最惠国待遇系统局域网)    ,在一个工业环境,特别是对工厂和其他...

网络通讯协议术语释义

一、 VRP简介 VRP(Versatile Routing Platform,通用路由平台)是华为公司数据通信产品的通用网络操作系统平台,为Quidway®系列路由器、Radium骨干ATM交换机...
  • zj0910
  • zj0910
  • 2011年12月23日 23:57
  • 1012

Modbus 网络通讯协议

1、概述 通信协议详细地描述了温湿度传感器的输入和输出命令、信息和数据,以便第三方使用和开发。 1.1通信协议的作用     使信息和数据在上位机(主站)和温湿度传感器之间有效地传递,允许访问温...

OSI和TCP/IP模型之间的区别-----无线网络通讯协议有哪些

源地址:http://l-o-v-e-lover.blog.163.com/blog/static/11326424720112455028957/   =====================...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:我的IM - 基础篇[3] - 基于UDP通讯的IM设计[基于XML格式的网络通讯协议 以及 包解析器和包处理器的基础概念]
举报原因:
原因补充:

(最多只允许输入30个字)