利用RHSocketKit构建自定义协议通信
在网络传输中,tcp/ip协议只是网络的基础,分别属于传输层和网络层。我们各种应用之间的通信需要依赖各种各样的协议,是建立在tcp/ip之上的,比如典型的http协议。
在开发过程中,一般我们制定的协议需要两个部分,header和content。
1-header:协议头部,放置一些meta信息。
2-content:应用之间交互的信息主体。
例如:分隔符delimiter-2个字节|数据包类型type-2个字节|长度length(不含包头长度)-4个字节|数据信息主体content-length个子节
其中delimiter,type,length就是header信息,content就是交互的主体。
我们来利用RHSocketKit构造一个数据包对象。
#import "RHSocketPacketContext.h"
@interface RHSocketCustomRequest : RHSocketPacketRequest
//这里,我们把content数据放在夫类的object变量中。
//length可以通过object数据直接获得,不再申明额外的变量。
@property (nonatomic, assign) int16_t fenGeFu;
@property (nonatomic, assign) int16_t dataType;
@end
数据包已经创建好了,那么我们在RHSocketKit中如何去对这种自定义的协议编码(Encode)呢?
定义编码协议RHSocketEncoderProtocol和解码协议RHSocketDecoderProtocol。
RHSocketCustom0330Encoder:编码器,将发送包的数据从一种格式转换成二进制数组。
RHSocketCustom0330Decoder:解码器,将接收包的二进制数组转换成可读的变量数据。
RHSocketCustom0330Encoder文件
#import <Foundation/Foundation.h>
#import "RHSocketCodecProtocol.h"
@interface RHSocketCustom0330Encoder : NSObject <RHSocketEncoderProtocol>
@end
#import "RHSocketCustom0330Encoder.h"
#import "RHSocketException.h"
#import "RHSocketUtils.h"
#import "RHSocketCustomRequest.h"
@implementation RHSocketCustom0330Encoder
- (void)encode:(id<RHUpstreamPacket>)upstreamPacket output:(id<RHSocketEncoderOutputProtocol>)output
{
id object = [upstreamPacket object];
if (![object isKindOfClass:[NSData class]]) {
[RHSocketException raiseWithReason:@"[Encode] object should be NSData ..."];
return;
}
NSData *data = object;
if (data.length == 0) {
return;
}//
RHSocketCustomRequest *req = (RHSocketCustomRequest *)upstreamPacket;
NSUInteger dataLen = data.length;
//<strong><span style="color:#ff0000;">注意这里,按照协议的描述,顺序把数值转