iOS開發(fā)輕松學習Socket

這兩天很多學員都想聽聽關于 Socket 的內(nèi)容! 所以花了一點時間就給它備了出來,公開課分享完全足夠了!

這里通過文字形式紀錄下來,方便大家對應學習

Socket是什么?

要了解什么是 Socket,首先需要了解 TCP/IP、UDP! ??

TCP/IP(Transmission Control Protocol/Internet Protocol)即傳輸控制協(xié)議/網(wǎng)間協(xié)議俩滥,是一個工業(yè)標準的協(xié)議集昌阿,它是為廣域網(wǎng)(WANs)設計的两芳。
UDP(User Data Protocol沛简,用戶數(shù)據(jù)報協(xié)議)是與TCP相對應的協(xié)議扰藕。它是屬于TCP/IP協(xié)議族中的一種问顷。

image

TCP/IP協(xié)議族包括運輸層九府、網(wǎng)絡層稻励、鏈路層「缸瑁現(xiàn)在你知道TCP/IP與UDP的關系了吧。

如果大家對于 七層協(xié)議模型 不是非常了解的話,你可以,沉下心來看看下面???? 這張圖:

image

那么TCP/IP望抽、UDPsocket又有什么關系呢???

Socket應用層TCP/IP協(xié)議族通信的中間軟件抽象層加矛,它是一組接口。在設計模式中煤篙,Socket其實就是一個門面模式斟览,它把復雜的TCP/IP協(xié)議族隱藏在Socket接口后面,對用戶來說辑奈,一組簡單的接口就是全部苛茂,讓Socket去組織數(shù)據(jù)已烤,以符合指定的協(xié)議。

image

Socket怎么用

這里其實還有很多網(wǎng)絡相關的知識需要科普,但是篇幅有限,如果靚仔靚女的你對于這一塊有點陌生,你可以買一些網(wǎng)絡相關的書籍

  • 《TCP/IP詳解 卷1:協(xié)議》
  • 《圖解HTTP》
  • 《Unix網(wǎng)絡編程》
  • HTTPS權威指南

Socket 作為一套接口,那么是怎么用的呢? 下面一圖勝前言: ??

image

Socket 傳輸?shù)奶攸c:

  • 1: 傳輸數(shù)據(jù)為字節(jié)級妓羊,傳輸數(shù)據(jù)可自定義胯究,數(shù)據(jù)量(對于手機應用講:費用低)
  • 2: 傳輸數(shù)據(jù)時間短,性能高
  • 3: 適合于客戶端和服務器端之間信息實時交互
  • 4: 可以加密,數(shù)據(jù)安全性強

正因為這些優(yōu)勢,常被用來做即時通訊重要媒介

image

上圖就是通過 socket 在客戶端和終端做的來回通訊

socket使用代碼實現(xiàn):

1: 創(chuàng)建socket

int socketID = socket(AF_INET, SOCK_STREAM, 0);
self.clinenId= socketID;
if (socketID == -1) {
    NSLog(@"創(chuàng)建socket 失敗");
    return;
}
  • domain:協(xié)議域躁绸,又稱協(xié)議族(family)裕循。常用的協(xié)議族有AF_INETAF_INET6涨颜、AF_LOCAL(或稱AF_UNIX费韭,UnixSocket)、AF_ROUTE等庭瑰。協(xié)議族決定了socket的地址類型星持,在通信中必須采用對應的地址,如AF_INET決定了要用ipv4地址(32位的)與端口號(16位的)的組合弹灭、AF_UNIX決定了要用一個絕對路徑名作為地址督暂。
  • type:指定Socket類型。常用的socket類型有SOCK_STREAM穷吮、SOCK_DGRAM逻翁、SOCK_RAWSOCK_PACKET捡鱼、SOCK_SEQPACKET等八回。流式SocketSOCK_STREAM)是一種面向連接的Socket,針對于面向連接的TCP服務應用驾诈。數(shù)據(jù)報式SocketSOCK_DGRAM)是一種無連接的Socket缠诅,對應于無連接的UDP服務應用。
  • protocol:指定協(xié)議乍迄。常用協(xié)議有IPPROTO_TCP管引、IPPROTO_UDPIPPROTO_STCP闯两、IPPROTO_TIPC等褥伴,分別對應TCP傳輸協(xié)議、UDP傳輸協(xié)議漾狼、STCP傳輸協(xié)議重慢、TIPC傳輸協(xié)議。

注意:1.typeprotocol不可以隨意組合逊躁,如SOCK_STREAM不可以跟IPPROTO_UDP組合伤锚。當?shù)谌齻€參數(shù)為0時,會自動選擇第二個參數(shù)類型對應的默認協(xié)議。

  • 返回值:如果調(diào)用成功就返回新創(chuàng)建的套接字的描述符屯援,如果失敗就返回INVALID_SOCKETLinux下失敗返回-1

2: 建立連接

int result = connect(socketID, (const struct sockaddr *)&socketAddr, sizeof(socketAddr));

if (result != 0) {
    NSLog(@"鏈接失敗");
    return;
}
NSLog(@"鏈接成功");
  • 參數(shù)一:套接字描述符
  • 參數(shù)二:指向數(shù)據(jù)結構sockaddr的指針猛们,其中包括目的端口和IP地址
  • 參數(shù)三:參數(shù)二sockaddr的長度,可以通過sizeof(struct sockaddr)獲得
  • 返回值: 成功則返回0狞洋,失敗返回非0弯淘,錯誤碼GetLastError()
struct sockaddr_in socketAddr;
socketAddr.sin_family = AF_INET;
socketAddr.sin_port   = SocketPort;
struct in_addr socketIn_addr;
socketIn_addr.s_addr  = SocketIP;
socketAddr.sin_addr   = socketIn_addr;
  • __uint8_t sin_len; 假如沒有這個成員吉懊,其所占的一個字節(jié)被并入到sin_family成員中
  • sa_family_t sin_family; 一般來說AF_INET(地址族)PF_INET(協(xié)議族)
  • in_port_t sin_port; // 端口
  • struct in_addr sin_addr; // ip
  • char sin_zero[8]; 沒有實際意義,只是為了 跟SOCKADDR結構在內(nèi)存中對齊

3: 發(fā)送消息

if (self.sendMsgContent_tf.text.length == 0) {
    return;
}
const char *msg = self.sendMsgContent_tf.text.UTF8String;
ssize_t sendLen = send(self.clinenId, msg, strlen(msg), 0);
NSLog(@"發(fā)送 %ld 字節(jié)",sendLen);
[self showMsg:self.sendMsgContent_tf.text msgType:0];
self.sendMsgContent_tf.text = @"";
  • s:一個用于標識已連接套接口的描述字庐橙。
  • buf:包含待發(fā)送數(shù)據(jù)的緩沖區(qū)。
  • len:緩沖區(qū)中數(shù)據(jù)的長度借嗽。
  • flags:調(diào)用執(zhí)行方式态鳖。
  • 返回值: 如果成功,則返回發(fā)送的字節(jié)數(shù)恶导,失敗則返回SOCKET_ERROR.一個中文對應 3 個字節(jié)浆竭!UTF8 編碼!

4: 接受消息

while (1) {
    uint8_t buffer[1024];
    ssize_t recvLen = recv(self.clinenId, buffer, sizeof(buffer), 0);
    if (recvLen == 0) {
        NSLog(@"接收到了0個字節(jié)");
        continue;
    }
    // buffer -> data -> string
    NSData *data = [NSData dataWithBytes:buffer length:recvLen];
    NSString *str= [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"%@---%@",[NSThread currentThread],str);
    dispatch_async(dispatch_get_main_queue(), ^{
        [self showMsg:str msgType:1];
        self.sendMsgContent_tf.text = @"";
    });
}
  • 參數(shù)一: 客戶端socket
  • 參數(shù)二: 接收內(nèi)容緩沖區(qū)地址
  • 參數(shù)三: 接收內(nèi)容緩存區(qū)長度
  • 參數(shù)四: 接收方式惨寿,0表示阻塞邦泄,必須等待服務器返回數(shù)據(jù)
  • 返回值:如果成功,則返回讀入的字節(jié)數(shù)裂垦,失敗則返回SOCKET_ERROR

Socket 總結

Socket 的使用還是非常簡單的! 對于iOS開發(fā)有點吃力的原因是在于:

  • 都是C函數(shù)
  • 函數(shù)參數(shù)多并且陌生
  • 網(wǎng)絡這一塊知識的盲區(qū)

如果想更加傻瓜式開發(fā),那么就請看下一個篇章: CocoaAsyncSocket 關于tcp和udp 實戰(zhàn)
大師重磅內(nèi)容(17)-CocoaAsyncSocket實現(xiàn)即時通訊
大師重磅內(nèi)容(18)-CocoaAsyncSocket實現(xiàn)畫板功能

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末顺囊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蕉拢,更是在濱河造成了極大的恐慌特碳,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晕换,死亡現(xiàn)場離奇詭異午乓,居然都是意外死亡,警方通過查閱死者的電腦和手機届巩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門硅瞧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來份乒,“玉大人恕汇,你說我怎么就攤上這事』蛳剑” “怎么了瘾英?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長颂暇。 經(jīng)常有香客問我缺谴,道長,這世上最難降的妖魔是什么耳鸯? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任湿蛔,我火速辦了婚禮膀曾,結果婚禮上,老公的妹妹穿的比我還像新娘阳啥。我一直安慰自己添谊,他們只是感情好,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布察迟。 她就那樣靜靜地躺著斩狱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪扎瓶。 梳的紋絲不亂的頭發(fā)上所踊,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機與錄音概荷,去河邊找鬼秕岛。 笑死,一個胖子當著我的面吹牛乍赫,可吹牛的內(nèi)容都是我干的瓣蛀。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼雷厂,長吁一口氣:“原來是場噩夢啊……” “哼惋增!你這毒婦竟也來了?” 一聲冷哼從身側響起改鲫,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤诈皿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后像棘,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體稽亏,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年缕题,在試婚紗的時候發(fā)現(xiàn)自己被綠了截歉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡烟零,死狀恐怖瘪松,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情锨阿,我是刑警寧澤宵睦,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站墅诡,受9級特大地震影響壳嚎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一烟馅、第九天 我趴在偏房一處隱蔽的房頂上張望说庭。 院中可真熱鬧,春花似錦郑趁、人聲如沸口渔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缺脉。三九已至,卻和暖如春悦穿,著一層夾襖步出監(jiān)牢的瞬間攻礼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工栗柒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留礁扮,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓瞬沦,卻偏偏與公主長得像太伊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子逛钻,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

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

  • socket學習網(wǎng)站:http://c.biancheng.net/view/2124.html 一.什么是soc...
    小石頭呢閱讀 1,243評論 0 0
  • 研究IPv6 socket編程原因: Supporting IPv6 in iOS 9 WWDC2015蘋果宣布在...
    li大鵬閱讀 7,288評論 7 15
  • Socket基礎概念 網(wǎng)絡中進程之間如何通信僚焦? 網(wǎng)絡中進程之間如何通信?首要解決的問題是如何唯一標識一個進程曙痘,否則...
    DiamondsAndRust閱讀 4,739評論 2 54
  • iOS socket原理及連接過程 連接過程圖解 1.網(wǎng)絡中進程之間如何通信芳悲,如我們每天打開瀏覽器瀏覽網(wǎng)頁時,瀏覽...
    RobinZhao閱讀 3,038評論 0 5
  • 我們要討論的是網(wǎng)絡中進程之間如何通信边坤? 首要解決的問題是如何唯一標識一個進程名扛,否則通信無從談起! 在本地可以通過進...
    像小強一樣活著閱讀 2,370評論 0 14