Socket通信之GCDAsyncSocket用法

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

Socket

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

GCDAsyncSocket用法

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

    // 創(chuàng)建Socket對象
    // 設(shè)置代理,讓代理在全局隊列中調(diào)用
    GCDAsyncSocket *clientSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_global_queue(0, 0)];
    // 用強(qiáng)指針引用著Socket對象
    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);
    }
  • 常用的幾個代理,GCDAsyncSocketDelegate.注意:在鏈接成功之后要監(jiān)聽數(shù)據(jù)的讀取,接收到數(shù)據(jù)后也要監(jiān)聽數(shù)據(jù)的讀取,接收數(shù)據(jù)的代理不會被回調(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ā)送成功后可以在這個代理里面做一些處理
- (void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag{
    
    
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

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