CocoaAsyncSocket网络通信使用之数据编码和解码(二)
在上一篇CocoaAsyncSocket网络通信使用之tcp连接(一)中,我们已经利用CocoaAsyncSocket封装了自己的socket connection。
本篇主要是通过引入编码器和解码器,将可以共用的内容模块化。
简述:
在tcp的应用中,都是以二机制字节的形式来对数据做传输。
一般会针对业务协议构造对应的数据结构/数据对象,然后在使用的时候针对协议转换成二进制数据发送给服务端。
但是我们在不同的app中,不同的业务场景使用不同的tcp协议,这样每次socket模块的重用性就特别差,即使是完全一样的底层内容,也因为实现的时候耦合性太高,而导致需要全部重新开发。为了实现模块化的重用,我仿照mina和netty,引入编码器和解码器。
接口框架设计:
为了后续扩展和自定义实现自己的编码器/解码器,有了以下的设计接口。
数据包
数据包基本接口定义( RHSocketPacket.h):
#import <Foundation/Foundation.h>
@protocol RHSocketPacket <NSObject>
@property (nonatomic, assign, readonly) NSInteger tag;
@property (nonatomic, strong, readonly) NSData *data;
- (instancetype)initWithData:(NSData *)data;
@optional
- (void)setTag:(NSInteger)tag;
- (void)setData:(NSData *)data;
@end
数据包内容接口定义(RHSocketPacketContent.h):(增加timeout超时字段,主要是针对发送的数据包)
#import <Foundation/Foundation.h>
#import "RHSocketPacket.h"
@protocol RHSocketPacketContent <RHSocketPacket>
@property (nonatomic, readonly) NSTimeInterval timeout;
@optional
- (void)setTimeout:(NSTimeInterval)timeout;
@end
tcp编码器
编码器接口定义( RHSocketEncoderProtocol.h):
#import <Foundation/Foundation.h>
#import "RHSocketPacketContent.h"
@protocol RHSocketEncoderOutputDelegate <NSObject>
@required
- (void)didEncode:(NSData *)data timeout:(NSTimeInterval)timeout tag:(NSInteger)tag;
@end
@protocol RHSocketEncoderProtocol <NSObject>
@required
- (void)encodePacket:(id<RHSocketPacketContent>)packet encoderOutput:(id<RHSocketEncoderOutputDelegate>)output;
@end
tcp解码器