2.1 TCP Socket(含SSL)通讯库GCDAsyncSocket(四)

CocoaAsyncSocket 网络通信使用之http协议测试(三)


通过前一篇CocoaAsyncSocket网络通信使用之数据编码和解码(二),我们已经搭建好了socket的框架。

框架主要分为以下5个模块:

1-网络连接模块(socket connection)

2-数据协议框架(socket packet content protocol)

3-发送数据前的编码模块(socket encoder protocol)

4-接收数据后的解码模块(socket decoder protocol)

5-各模块的组合调用(socket service)


简述:

通过5个模块的协同工作,可以方便的处理tcp通信的扩展。

因为不方便公开外网服务,不能很好的测试自定义协议的编码器/解码器,

只是简单的对网络连接成功做了打印,现在我们来实践下框架的扩展用法。


http(HyperText Transport Protocol,超文本传输协议)

其实现在网上随处可见http协议的服务,而http是基于tcp/ip的,我们正好可以借用http来实践我们的用法。

现在就针对http协议来实现我们的编码器/解码器。


http协议内容很多,本文主要是测试sokcet框架,确认框架的完整性,拓展性,具体协议内容请自行搜索(http协议格式)。

以下是实现编码器/解码器时,学习的网址:(强烈建议学习一下,否则不好理解http编码器/解码器的内容哦)

http://blog.csdn.net/gueter/article/details/1524447


http协议的测试[编码器/解码器]

代码中只是测试用例,并非真实完整实现,看官勿喷。


RHPacketHttpRequest.h文件:(http协议的测试请求包)

[objc]  view plain  copy
  1. #import "RHPacketBody.h"  
  2.   
  3. @interface RHPacketHttpRequest : RHPacketBody  
  4.   
  5. @property (nonatomiccopyNSString *requestPath;  
  6. @property (nonatomiccopyNSString *host;  
  7. @property (nonatomiccopyNSString *connection;  
  8.   
  9. @end  

RHPacketHttpRequest.m文件:(只是测试,默认写了几个请求参数)

[objc]  view plain  copy
  1. #import "RHPacketHttpRequest.h"  
  2.   
  3. @implementation RHPacketHttpRequest  
  4.   
  5. - (instancetype)init  
  6. {  
  7.     if (self = [super init]) {  
  8.         _requestPath = @"GET /index.html HTTP/1.1";  
  9.         _host = @"Host:www.baidu.com";  
  10.         _connection = @"Connection:close";  
  11.     }  
  12.     return self;  
  13. }  
  14.   
  15. - (NSData *)data  
  16. {  
  17.     NSData *crlfData = [@"\r\n" dataUsingEncoding:NSASCIIStringEncoding];<span style="font-family: Arial, Helvetica, sans-serif;">//回车换行是http协议中每个字段的分隔符</span>  
  18.       
  19.     NSMutableData *packetData = [[NSMutableData alloc] init];  
  20.     [packetData appendData:[_requestPath dataUsingEncoding:NSASCIIStringEncoding]];  
  21.     [packetData appendData:crlfData];  
  22.     [packetData appendData:[_host dataUsingEncoding:NSASCIIStringEncoding]];  
  23.     [packetData appendData:crlfData];  
  24.     [packetData appendData:[_connection dataUsingEncoding:NSASCIIStringEncoding]];  
  25.     [packetData appendData:crlfData];  
  26. //    [packetData appendData:[@"Accept:image/webp,*/*;q=0.8" dataUsingEncoding:NSASCIIStringEncoding]];  
  27. //    [packetData appendData:crlfData];  
  28.     return packetData;  
  29. }  
  30.   
  31. @end  


RHSocketHttpEncoder.h文件:(http协议的测试编码器)

[objc]  view plain  copy
  1. #import <Foundation/Foundation.h>  
  2. #import "RHSocketEncoderProtocol.h"  
  3.   
  4. @interface RHSocketHttpEncoder : NSObject <RHSocketEncoderProtocol>  
  5.   
  6. @end  


RHSocketHttpEncoder.m文件:

[objc]  view plain  copy
  1. #import "RHSocketHttpEncoder.h"  
  2. #import "RHSocketConfig.h"  
  3.   
  4. @implementation RHSocketHttpEncoder  
  5.   
  6. - (void)encodePacket:(id<RHSocketPacketContent>)packet encoderOutput:(id<RHSocketEncoderOutputDelegate>)output  
  7. {  
  8.     NSData *data = [packet data];  
  9.     NSMutableData *sendData = [NSMutableData dataWithData:data];  
  10.     NSData *crlfData = [@"\r\n" dataUsingEncoding:NSASCIIStringEncoding];//回车换行是http协议中每个字段的分隔符,也是请求的结束符  
  11.     [sendData appendData:crlfData];  
  12.       
  13.     NSTimeInterval timeout = [packet timeout];  
  14.     NSInteger tag = [packet tag];  
  15.     RHSocketLog(@"tag:%ld, timeout: %f, data: %@", (long)tag, timeout, sendData);  
  16.     [output didEncode:sendData timeout:timeout tag:tag];  
  17. }  
  18.   
  19. @end  


RHSocketHttpDecoder.h文件:(http协议的测试解码器)

[objc]  view plain  copy
  1. #import <Foundation/Foundation.h>  
  2. #import "RHSocketDecoderProtocol.h"  
  3.   
  4. @interface RHSocketHttpDecoder : NSObject <RHSocketDecoderProtocol>  
  5.   
  6. @end  


RHSocketHttpDecoder.m文件:

[objc]  view plain  copy
  1. #import "RHSocketHttpDecoder.h"  
  2. #import "RHSocketConfig.h"  
  3. #import "RHPacketHttpResponse.h"  
  4.   
  5. @interface RHSocketHttpDecoder ()  
  6. {  
  7.     NSMutableData *_receiveData;  
  8. }  
  9.   
  10. @end  
  11.   
  12. @implementation RHSocketHttpDecoder  
  13.   
  14. - (NSUInteger)decodeData:(NSData *)data decoderOutput:(id<RHSocketDecoderOutputDelegate>)output tag:(long)tag  
  15. {  
  16.     @synchronized(self) {  
  17.         if (_receiveData) {  
  18.             [_receiveData appendData:data];  
  19.         } else {  
  20.             _receiveData = [NSMutableData dataWithData:data];  
  21.         }  
  22.           
  23.         NSUInteger dataLen = _receiveData.length;  
  24.         NSInteger headIndex = 0;  
  25.         int crlfCount = 0;  
  26.           
  27.         for (NSInteger i=0; i<dataLen; i++) {  
  28.             uint8_t byte;  
  29.             [_receiveData getBytes:&byte range:NSMakeRange(i, 1)];  
  30.             if (byte == 0x0a) {//0x0a是http协议中的字段分隔符,我们只是测试程序,简单解析对应返回数据,然后打印  
  31.                 crlfCount++;  
  32.             }  
  33.             if (crlfCount == 2) {  
  34.                 NSInteger packetLen = i - headIndex;  
  35.                 NSData *packetData = [_receiveData subdataWithRange:NSMakeRange(headIndex, packetLen)];  
  36.                 RHPacketHttpResponse *rsp = [[RHPacketHttpResponse alloc] initWithData:packetData];  
  37.                 [output didDecode:rsp tag:0];  
  38.                 headIndex = i + 1;  
  39.                 crlfCount = 0;  
  40.             }  
  41.         }  
  42.           
  43.         NSData *remainData = [_receiveData subdataWithRange:NSMakeRange(headIndex, dataLen-headIndex)];  
  44.         [_receiveData setData:remainData];  
  45.           
  46.         return _receiveData.length;  
  47.     }//@synchronized  
  48. }  
  49.   
  50. @end  

测试调用方法:

[objc]  view plain  copy
  1. NSString *host = @"www.baidu.com";  
  2. int port = 80;  
  3.   
  4. [RHSocketService sharedInstance].encoder = [[RHSocketHttpEncoder alloc] init];  
  5. [RHSocketService sharedInstance].decoder = [[RHSocketHttpDecoder alloc] init];  
  6. [[RHSocketService sharedInstance] startServiceWithHost:host port:port];  

也可以继承RHSocketService对象,重载里面的接口方法,增加短线重连等等逻辑。


总结:

以上就是针对http协议实现的测试代码,我们可以看到,socket框架中的代码无需修改,完全可以共用。

这样以后即使是不同应用,不同的业务协议,也不需要重复造轮子了。

文章中都是以代码的方式呈现的,习惯看代码的同学可能比较易懂,但是缺乏整体框架的说明描述。

下一篇,针对当前的框架,绘制uml类图结构。

转载自:http://blog.csdn.net/zhu410289616/article/details/46746683

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值