该系列文章不会过多的介绍原理知识,意在应用方面,没有socket编码经验的看了此系列文章后可以完全上手并初步了解tcp/ip。如果需要更深的理解请参考其他书籍及文章。
一,第三方框架介绍
在app开发过程中用的最多的是http/https(其实是用tcp/IP实现的),大部分功能是获取数据,显示数据,用户主动请求的一对一模式,服务器不能主动的向app发送数据。tcp/IP是面向链接,稳定,数据流(无边界)的,后面我们会根据这些特性来编写代码。常用的第三方框架有2种,一种基于nsrunloop,一种基于gcd,后面讲的都是用基于nsrunloop的CocoaAsyncSocket。robbiehanson/CocoaAsyncSocket · GitHub
二,�项目中使用的接口及协议回调
项目中要用的的api
1,- (id)initWithDelegate:(id)delegate;初始化并设置委托
2,- (BOOL)connectToHost:(NSString*)hostname onPort:(UInt16)port error:(NSError**)errPtr;根据ip及端口链接服务器;
3,- (void)writeData:(NSData*)data withTimeout:(NSTimeInterval)timeout tag:(long)tag;发送数据;
4,- (void)disconnect;断开链接;
上面提到了设置委托,要实现以下委托方法
1,- (void)onSocket:(AsyncSocket*)sock didConnectToHost:(NSString*)host port:(UInt16)port;建立连接成功后回调;
2,-(void) onSocket:(AsyncSocket*)socket willDisconnectWithError:(NSError*)err;连接断开后回调;
3,-(void) onSocket:(AsyncSocket*)sock didReadData:(NSData*)data withTag:(long)tag;接收数据回调;
其他api及协议可以看源码中的注释,使用以上api就可以满足项目的需求(我的情况)
三,二次封装
在项目中为了方便管理和分离,我们应该在这个库上加一层封装,下面代码为头文件,首先根据tcp/ip流程来建立头文件
1,建立socket 2,请求连接 3,发送数据 4,接收数据 5,关闭
@classAsyncSocket;
@interfaceTCPIPStream :NSObject
{
uint8_t m_pBuffer[SOCKET_TCP_BUFFER];//接收缓冲 1
int m_nBufferLen;//缓冲长度 2
}
@property(nonatomic,weak)id delegate;//处理接口
@property(nonatomic,strong)AsyncSocket*m_pSocket;
/**创建*/
+ (instancetype)CreateTcpIPStream:(id)delegate;
/**初始化*/
- (instancetype)initTcpIPSteam:(id)delegate;
/**直接获取服务器的输入输出流*/
-(void)CreateConnectWithAddress:(NSString*)address port:(uint)port;
/**发送数据*/
-(bool)SendToServer:(uint8_t*)pData size:(uint)nDataSize;
/**关闭连接*/
-(void)ClosedStream;