SuperSocket 1.4系列文档(8) 自定义协议
2011-04-28 21:50
507 查看
Socket里面的协议解析是Socket通讯程序设计中最复杂的地方,如果你的应用层协议设计或实现不佳,Socket通讯中常见的粘包,分包就难以避免。SuperSocket内置了命令行格式的协议CommandLineProtocol,如果你的用用使用了其它格式的协议,你就必须自行实现自定义协议CustomProtocol。
实现自定义协议
实现自定义协议需要实现ICustomProtocol的Protocol类,和一个实现ICommandReader接口的CommandReader类。
实现ICustomProtocol需要一个实现ICommandInfo的类TCommandInfo来作为泛型参数,类应包含你的协议中每个命令/包的基本数据结构。实现CreateCommandReader方法只需根据appServer来实例化你的CommandReader,下面就来讲讲CommandReader。
上面是你要实现的ICommandReader接口。
IAppServerAppServer{get;}:
返回当前CommandReader运行于的AppServer;
intLeftBufferSize{get;}:
返回当前CommandReader所缓存数据的大小;
ICommandReader<TCommandInfo>NextCommandReader{get;}:
指定下轮数据接收到时所使用的CommandReader实例,不设则使用当前CommandReader实例;
TCommandInfoFindCommandInfo(IAppSessionsession,byte[]readBuffer,intoffset,intlength,boolisReusableBuffer,outintleft);
FindCommandInfo方法是CommandReader要实现的核心方法,各个参数的解释如下:
IAppSessionsession–Socket所属的AppSession
byte[]readBuffer-接收缓冲区
intoffset–本次接收到的数据在整个接收缓冲区的位移
intlength–本次接收到的数据的长度
boolisReusableBuffer–表明接收缓冲区是否会在下次接受中被重复利用,如果是,你的代码就不能将readerBuffer这个缓冲区直接用于CommandReader缓存
outintleft-未解析的本次接收数据的长度
返回值TCommandInfo-返回在缓冲区内找到协议命令数据,如果未找到,返回null。SuperSocket引擎会根据返回值的Key属性来找到相应的命令来执行。如Key为"ECHO",名为ECHO的命令将会被执行,此CommandInfo将会是这个命令执行的参数。
使用自定义协议
使用自定义协议的方法很简单,只需在你的AppServer里,调用基类构造方法时将CustomProtocol实例传进去:
注意AppServer所使用的泛型参数TCommandInfo应于CustomProtocol中的泛型参数TCommandInfo相同。
更详细的示例请参考SuperSocket源代码中QuickStart目录中的GPSSocketServer和CustomProtocol项目。
实现自定义协议
实现自定义协议需要实现ICustomProtocol的Protocol类,和一个实现ICommandReader接口的CommandReader类。
publicinterfaceICustomProtocol<TCommandInfo>
whereTCommandInfo:ICommandInfo
{
ICommandReader<TCommandInfo>CreateCommandReader(IAppServerappServer);
}
实现ICustomProtocol需要一个实现ICommandInfo的类TCommandInfo来作为泛型参数,类应包含你的协议中每个命令/包的基本数据结构。实现CreateCommandReader方法只需根据appServer来实例化你的CommandReader,下面就来讲讲CommandReader。
publicinterfaceICommandReader<TCommandInfo>
whereTCommandInfo:ICommandInfo
{
IAppServerAppServer{get;}
TCommandInfoFindCommandInfo(IAppSessionsession,byte[]readBuffer,intoffset,intlength,boolisReusableBuffer,outintleft);
intLeftBufferSize{get;}
ICommandReader<TCommandInfo>NextCommandReader{get;}
}
上面是你要实现的ICommandReader接口。
IAppServerAppServer{get;}:
返回当前CommandReader运行于的AppServer;
intLeftBufferSize{get;}:
返回当前CommandReader所缓存数据的大小;
ICommandReader<TCommandInfo>NextCommandReader{get;}:
指定下轮数据接收到时所使用的CommandReader实例,不设则使用当前CommandReader实例;
TCommandInfoFindCommandInfo(IAppSessionsession,byte[]readBuffer,intoffset,intlength,boolisReusableBuffer,outintleft);
FindCommandInfo方法是CommandReader要实现的核心方法,各个参数的解释如下:
IAppSessionsession–Socket所属的AppSession
byte[]readBuffer-接收缓冲区
intoffset–本次接收到的数据在整个接收缓冲区的位移
intlength–本次接收到的数据的长度
boolisReusableBuffer–表明接收缓冲区是否会在下次接受中被重复利用,如果是,你的代码就不能将readerBuffer这个缓冲区直接用于CommandReader缓存
outintleft-未解析的本次接收数据的长度
返回值TCommandInfo-返回在缓冲区内找到协议命令数据,如果未找到,返回null。SuperSocket引擎会根据返回值的Key属性来找到相应的命令来执行。如Key为"ECHO",名为ECHO的命令将会被执行,此CommandInfo将会是这个命令执行的参数。
使用自定义协议
使用自定义协议的方法很简单,只需在你的AppServer里,调用基类构造方法时将CustomProtocol实例传进去:
classCustomProtocolServer:AppServer<CustomProtocolSession,BinaryCommandInfo>
{
publicCustomProtocolServer()
:base(newMyCustomProtocol())
{
}
}
注意AppServer所使用的泛型参数TCommandInfo应于CustomProtocol中的泛型参数TCommandInfo相同。
更详细的示例请参考SuperSocket源代码中QuickStart目录中的GPSSocketServer和CustomProtocol项目。
相关文章推荐
- SuperSocket 1.4系列文档(12) 命令过滤器(Command Filter)
- SuperSocket 1.4系列文档(4) 使你的SuperSocket AppServer运行
- SuperSocket 1.4系列文档(14) 多服务器实例和服务器实例之间的交互
- SuperSocket 1.4系列文档(15) 在SuperSocket中启用内置Flash/Silverlight策略服务器
- SuperSocket 1.4系列文档(1) 第一个例子, EchoService
- SuperSocket 1.4系列文档(13) 连接过滤器(Connection Filter)
- SuperSocket 1.4系列文档(16) 在SuperSocket中启用传输层加密(TLS/SSL)
- SuperSocket 1.4系列文档(9) 通过AppServer获得需要的session并进行通信
- SuperSocket 1.4系列文档(11) 扩展服务器配置
- SuperSocket 1.4系列文档(2) SuperSocket的基本配置
- SuperSocket 1.4系列文档(10) SuperSocket中的日志功能
- supersocket--SuperSocket 1.4系列文档(1) 第一个例子, EchoService
- SuperSocket 1.4系列文档(17) 在Windows Azure中运行SuperSocket
- SuperSocket 1.4系列文档(18) 在Unix/Linux操作系统中通过Mono运行SuperSocket
- SuperSocket 1.4系列文档(3) 使用SuperSocket的第一步,实现你自己的AppServer和AppSession
- SuperSocket 1.4 文档列表
- SuperSocket 1.4系列文档(5) 实现你的Socket命令
- 使用SuperSocket实现TLV自定义协议网络通信的Demo
- 使用SuperSocket实现TLV自定义协议网络通信的Demo
- SuperSocket 1.4系列文档(7) 命令行协议