該系列文章不會過多的介紹原理知識,意在應用方面,沒有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;