现在的位置: 首页 > 综合 > 正文

使用SuperSocket实现TLV自定义协议网络通信的Demo

2013年08月26日 ⁄ 综合 ⁄ 共 2121字 ⁄ 字号 评论关闭

原文地址:http://www.cnblogs.com/liping13599168/archive/2011/07/09/2101064.html 

前些天看到江大鱼发布了SuperSocket
1.4正式版
,由于最近项目使用到了网口的通讯编程,于是,也查看了下SuperSocket源代码,发现架构还是很清晰的,并且易于扩展,具体中文文档详见:http://www.cnblogs.com/jzywh/archive/2011/04/19/SuperSocketDocument.html

 

      今天我要说的是,如果通过SuperSocket自定义一个应用协议。由于项目中的服务通过TLV的协议进行数据传输,而通过网口是其中的一个通讯方式,当然项目中还包括通过串口、USB设备、USB数据线等等进行数据传输。其中网口通讯,采用TCP通讯的方式。什么是TLV呢,可以参考一下我之前写的一篇文章:《金融系统中PBOC/EMV的TLV的算法实现》,里面对于TLV有了详细的介绍,这里不再敖述。由于项目中的TLV协议还要涉及到一些报文头以及校验码的考虑,本篇文章将跳过这些考虑,直接谈核心的数据包TLV的传输。

 

具体思路

1、创建一个解决方案TLVSocketDemo。

 

2、创建项目TLVSocketDemo.Server,这个项目主要作为服务端的基本类库,包含一些AppServer,AppSession的扩展实现。当然SuperSocket 提供了一个名叫"SocketService"的项目,它是一个能够让AppServer运行于其中的容器。于是需要把SocketService相关的一些文件复制到生成输出目录中。

image

 

3、AppServer的子类实现:

public class TLVProtocolServer : AppServer 



    
public TLVProtocolServer() 

        : 
base(new TLVProtocol()) 

    {


    } 

}

 

4、AppSession的子类实现:

public class TLVProtocolSession : AppSession 



    
public override void HandleExceptionalError(Exception e) 

    {


    } 

}

 

5、TLVEntityListCommandInfo是服务器端收到的一个命令实体类,这个类必须继承于CommandInfo:

public class TLVEntityListCommandInfo : CommandInfo> 



    
public TLVEntityListCommandInfo(string key, List data) 

        : 
base(key, data) 

    {


    } 

}

实际上,TLVEntity就是一个TLV的实体结构。TLVEntity类的实现:

    [Serializable] 

    
///  

    
/// TLV实体 

    
///  
    public class TLVEntity 

    { 

        
///  

        
/// 标记 

        
///  
        public byte[] Tag { getset; }


        
///  

        
/// 数据长度 

        
///  
        public byte[] Length { getset; }


        
///  

        
/// 数据 

        
///  
        public byte[] Value { getset; }


        
///  

        
/// 标记占用字节数 

        
///  
        public int TagSize { getset; }


        
///  

        
/// 数据长度占用字节数 

        
///  
        public int LengthSize { getset; }


        
///  

        
/// 子嵌套TLV实体 

        
///  
        public TLVEntity Sub_TLVEntity { getset; } 

    }

 

6、自定义协议:TLVProtocol.cs,继承于ICustomProtocol的范型接口:

public class TLVProtocol : ICustomProtocol 



    
public ICommandReader CreateCommandReader(IAppServer appServer) 

    { 

        
return new TLVCommandReader(appServer); 

    } 

}

通过创建(CreateCommandReader方法)来得到字节数组数据的的读取方式。

 

抱歉!评论已关闭.