GCDAsyncSocket 地址: https://github.com/robbiehanson/CocoaAsyncSocket/
使用方法:
創建:
asyncsocket
= [[GCDAsyncSocket alloc] initWithDelegate: self delegateQueue:dispatch_get_main_queue()]; |
這裏我們讓所有的回調執行都發生在主線程的queue裏,當然我們可以傳一個專用的queue.
連接 :
NSError *err
= nil ; if (![asyncsocket
connectToHost:@ "deusty.com" onPort:80
error:&err]) //
Asynchronous! { //該方法異步,返回錯誤是因爲
delegate沒設置等 NSLog (@ "I
goofed: %@" ,
err); } |
該方法會立刻返回,當成功連接上,delegate 的 socket:didConnectToHost:port: 方法會被調用.
-
( void )socket:(GCDAsyncSocket
*)sender didConnectToHost:( NSString *)host
port:(UInt16)port { NSLog (@ "Cool,
I'm connected! That was easy." ); } |
有幾種不同的連接方法,比如帶超時的.。。。
雖然這個時候可能 socket 還沒連接上,但是我們依然可以投遞 讀/寫 請求:
[asyncSocket
readDataToLength:LENGTH_HEADER withTimeout:-1 tag:TAG_HEADER]; |
這樣讀請求會自動進入了隊列,當socket 連接上後,請求會自動出隊被執行。(這裏假設先讀一個包頭,再根據長度接收包體,這個讀操作完成後 socket:didReadData:withTag: 會被調用)
當然我們可以投遞多個讀寫操作而不必等待上一個完成.
[asyncSocket
writeData:msgHeader withTimeout:-1 tag:TAG_HEADER]; [asyncSocket
writeData:msgBody withTimeout:-1 tag:TAG_BODY]; |
上面的操作均爲異步。下面爲操作完成的委託方法:
read:
- (void)socket:(GCDAsyncSocket *)sender didReadData:(NSData *)data withTag:(long)tag { if (tag == TAG_HEADER) { int bodyLength = [self parseHeader:data]; [socket readDataToLength:bodyLength withTimeout:-1 tag:TAG_RESPONSE_BODY]; } else if (tag == TAG_RESPONSE_BODY) { // Process the response [self handleResponseBody:data]; // Start reading the next response [socket readDataToLength:headerLength withTimeout:-1 tag:TAG_FIXED_LENGTH_HEADER]; } } //還有另一個讀方法, // [asyncSocket readDataToData:msgSeparator withTimeout:TIMEOUT_NONE tag:TAG_CAPABILITIES]; // 讀當遇到一個指定的分隔符後操作返回。比如用作 http, 因爲http 每個消息都會有一個@"\r\n\r\n" 結尾標誌.
//如果想跟蹤進度 socket: didReadPartialDataOfLength: tag: 用這個
write:
-
( void )socket:(GCDAsyncSocket
*)sock didWriteDataWithTag:( long )tag { if (tag
==TAG_HEADER) <br> NSLog (@ "TAG_HEADER
request sent" ); |
else if (tag
==TAG_BODY) <br> NSLog (@ "TAG_BODY
request sent" ); |
} |
斷開釋放一個連接實例
[asyncSocket
setDelegate: nil delegateQueue: NULL ]; [asyncSocket
disconnect]; [asyncSocket
release]; |
相關的delegate 方法(回調)
socket:
didConnectToHost: port:<br> socket:
didReadData: withTag: socket:
didReadPartialDataOfLength: tag: socket:
shouldTimeoutReadWithTag: elapsed: bytesDone:<br> socket:
didWriteDataWithTag: socket:
didWritePartialDataOfLength: tag: socket:
shouldTimeoutWriteWithTag: elapsed: bytesDone:<br> socketDidSecure:<br> socket:
didAcceptNewSocket:<br> newSocketQueueForConnectionFromAddress:
onSocket:<br> socketDidCloseReadStream:<br> socketDidDisconnect:
withError:
|