Socket通信之GCDAsyncSocket用法

這篇文章只是簡(jiǎn)單記錄下GCDAsyncSocket用戶端的簡(jiǎn)單用法,后續(xù)我會(huì)把os層基于C的 BSD socket,Core Foundation層的CFNetWork以及cocoa層的NSStream簡(jiǎn)單用法整理出來,以備今后查詢.各位大神如果有深入的研究的或者有什么好的使用技巧了都可以交流下哦,歡迎指出使用不當(dāng)之處.

Socket

  • 網(wǎng)絡(luò)上的兩個(gè)程序通過一個(gè)雙向的通信連接實(shí)現(xiàn)數(shù)據(jù)的交換,這個(gè)連接的一端稱為一個(gè)socket
  • socket又稱"套接字", 應(yīng)用程序通過"套接字"向網(wǎng)絡(luò)發(fā)出請(qǐng)求或者應(yīng)答網(wǎng)絡(luò)請(qǐng)求.
  • socket常用的網(wǎng)絡(luò)請(qǐng)求TCP和UDP
    根據(jù)連接啟動(dòng)的方式以及本地套接字要連接的目標(biāo),套接字之間的連接過程可以分為三個(gè)步驟:服務(wù)器監(jiān)聽,客戶端請(qǐng)求,連接確認(rèn)。
    (1)服務(wù)器監(jiān)聽:是服務(wù)器端套接字并不定位具體的客戶端套接字,而是處于等待連接的狀態(tài),實(shí)時(shí)監(jiān)控網(wǎng)絡(luò)狀態(tài).
    (2)客戶端請(qǐng)求:是指由客戶端的套接字提出連接請(qǐng)求,要連接的目標(biāo)是服務(wù)器端的套接字.為此,客戶端的套接字必須首先描述它要連接的服務(wù)器的套接字,指出服務(wù)器端套接字的地址和端口號(hào),然后就向服務(wù)器端套接字提出連接請(qǐng)求.
    (3)連接確認(rèn):是指當(dāng)服務(wù)器端套接字監(jiān)聽到或者說接收到客戶端套接字的連接請(qǐng)求,它就響應(yīng)客戶端套接字的請(qǐng)求,建立一個(gè)新的線程,把服務(wù)器端套接字的描述發(fā)給客戶端,一旦客戶端確認(rèn)了此描述,連接就建立好了.而服務(wù)器端套接字繼續(xù)處于監(jiān)聽狀態(tài),繼續(xù)接收其他客戶端套接字的連接請(qǐng)求.
  • Socket的通信流程圖
Snip20160707_1.png

GCDAsyncSocket用法

-創(chuàng)建Socket對(duì)象.GCDAsyncSocket中socket鏈接后的事件處理都是在代理里面的

    // 創(chuàng)建Socket對(duì)象
    // 設(shè)置代理,讓代理在全局隊(duì)列中調(diào)用
    GCDAsyncSocket *clientSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_global_queue(0, 0)];
    // 用強(qiáng)指針引用著Socket對(duì)象
    self.clientSocket = clientSocket;
    
    NSString *host = nil;
    uint16_t port = 8288;
    // 連接服務(wù)器
    NSError *error = nil;
    
    [clientSocket connectToHost:host onPort:port error:&error];
    if (error) {
        NSLog(@"%@", error.localizedDescription);
    }
  • 常用的幾個(gè)代理,GCDAsyncSocketDelegate.注意:在鏈接成功之后要監(jiān)聽數(shù)據(jù)的讀取,接收到數(shù)據(jù)后也要監(jiān)聽數(shù)據(jù)的讀取,接收數(shù)據(jù)的代理不會(huì)被回調(diào).
// 連接成功后的回調(diào)
- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port{
    
    // 監(jiān)聽讀取數(shù)據(jù)
    [sock readDataWithTimeout:-1 tag:0];
    
}

// 與服務(wù)器斷開連接后的回調(diào)
- (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err{
    // 可以調(diào)用該方法查看斷開連接的原因
    NSLog(@"%@", err);
}

// 接收數(shù)據(jù)的回調(diào)
- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{
    // 接收到的消息
    NSString *messageStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"%@", messageStr);
    
    //  準(zhǔn)備讀取下次的數(shù)據(jù)
    [sock readDataWithTimeout:-1 tag:0];
    
}
  • 發(fā)送消息
/**
 *  發(fā)送消息
 *
 *  @param sendMessage 發(fā)送的消息內(nèi)容
 */
- (void)sendMessage:(NSString *)sendMessage{
    
    if (sendMessage == nil || sendMessage.length == 0) {
        return;
    }
    
    // 發(fā)送
    [self.clientSocket writeData:[sendMessage dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:0];
    
}

// 發(fā)送消息成功后的回調(diào),消息發(fā)送成功后可以在這個(gè)代理里面做一些處理
- (void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag{
    
    
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 第一部分、概念的理解1、什么是Socket?Socket又稱之為“套接字”,是系統(tǒng)提供的用于網(wǎng)絡(luò)通信的方法。它的實(shí)...
    Hevin_Chen閱讀 2,625評(píng)論 0 5
  • 參考:http://www.2cto.com/net/201611/569006.html TCP HTTP UD...
    F麥子閱讀 3,067評(píng)論 0 14
  • socket,究竟是什么東東,面試時(shí),筆試有他,面試也有他,如果做智能硬件,肯定會(huì)用到socket,所以,今天帶大...
    AirZilong閱讀 2,449評(píng)論 2 24
  • 1)OSI與TCP/IP各層的結(jié)構(gòu)與功能,都有哪些協(xié)議。 OSI分層 (7層):物理層、數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、傳輸層...
    ldlywt閱讀 2,389評(píng)論 0 26
  • 顏色 在喧白的屋宇里 被涂上三角形甜蜜的奶油味道 玻璃杯中的氣泡 和著門口的花香滑進(jìn)肚囊 輕音樂襯托下的鬧 白桌椅...
    五侯閱讀 353評(píng)論 0 1

友情鏈接更多精彩內(nèi)容