開源網絡庫 GCDAsyncSocket

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:

發佈了42 篇原創文章 · 獲贊 7 · 訪問量 34萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章