曾經(jīng)入門的socket, 過程回顧

socket 入門回顧, 直接上步驟


一砚亭、基礎(chǔ)知識(shí)

1.三大基礎(chǔ)認(rèn)識(shí)(IP 端口 協(xié)議)
IP 端口 協(xié)議.png
- IP地址,(2^8)^4 ,可表示42億網(wǎng)絡(luò)設(shè)備,可貌似連世界總?cè)丝诘拿黠@不夠吧陋守。so,??
- 外網(wǎng)/內(nèi)網(wǎng), 路由器,解決這些問題。你要是訪問百度,全國(guó)各地,可能分配了不同的IP擎宝。
- 服務(wù)器有不同的服務(wù) ,前端 通過端口 來訪問響應(yīng)服務(wù) ,但一般不是直接通過端口號(hào)訪問服務(wù) , 通過協(xié)議
服務(wù)器端口.png
2.終端ping的玩一下
- ①ping 127.0.0.1 不通 和 ②ping 192.168.31.180不通, 兩者是有區(qū)別的。
- 前者不通代表網(wǎng)卡問題, 后者則是通過ping 路由器下發(fā)到子節(jié)點(diǎn)本機(jī)的,可能路由的問題了浑玛。
image.png
3.協(xié)議 (7層模型)
7層模型.png
- 計(jì)算機(jī)起源 
第一臺(tái)computer用來打炮的
后來,計(jì)算機(jī)越來越多, 存儲(chǔ)數(shù)據(jù)方式-->磁帶打孔 存儲(chǔ)二進(jìn)制
再后來, 軟盤(媒介) 發(fā)明作為計(jì)算機(jī)之間通信數(shù)據(jù)方式
后來,科學(xué)家發(fā)現(xiàn) 二進(jìn)制數(shù)據(jù) 與 電流電信號(hào)(高低電平)一樣嘛,ok,走入正軌绍申。
- 七層模型底下3層(硬件) ,由通信芯片搞定,芯片代碼已經(jīng)寫死(效率非常高), 咱們是觸碰不到的, 咱就是站在巨人肩膀上開發(fā)
- socket是在傳輸層, 倆協(xié)議TCP、UDP顾彰。TCP/IP 協(xié)議是分不開的 , IP協(xié)議其實(shí)是在網(wǎng)絡(luò)層,我們用不到的拿不到的
image.png
- 上面三層,比較模糊,表示層极阅、會(huì)話層 許多協(xié)議都廢棄掉了,合成為一層 -- 應(yīng)用層
從傳輸層 拿到data, 怎么知道是一部電影還是一個(gè)小秘密呢,這就需要建立一個(gè)網(wǎng)絡(luò)會(huì)話(會(huì)話層),通過http協(xié)議在網(wǎng)絡(luò)會(huì)話中,按照協(xié)議特定的格式 對(duì)二進(jìn)制進(jìn)行解析
- 傳輸層, TCP/UDP保證計(jì)算機(jī)之間通信中拿到準(zhǔn)確的data ,但我咋知道你是啥數(shù)據(jù)呢??
- 會(huì)話層,兩個(gè)互相通 信的應(yīng)用進(jìn)程之間,建立涨享、組織和協(xié)調(diào)其交互(Interaction)
- 表示層, 負(fù)責(zé)在不同的數(shù)據(jù)格式之間進(jìn)行轉(zhuǎn)換操作(編碼筋搏、加密、壓縮)
4.深入?yún)f(xié)議UDP & TCP
image.png
小問題:  猜一猜咱開發(fā)中幾種場(chǎng)景,用的UDP 還是TCP ??  (a)游戲 (b)大文件下載
答案:    (a)UDP 會(huì)掉幀(掉1個(gè)64k內(nèi)的數(shù)據(jù)包)  (b)TCP (安全 完整, 效率低) because??
注意點(diǎn):  TCP連接握手三次,斷開握手四次
5.socket理解
image.png
想到socket 立馬想到 IP port ~
兩手機(jī)qq聊天, 手機(jī)a通過IP找到手機(jī),通過port找到應(yīng)用程序,然后建立連接,ok交流吧"約嗎?"
6.socket通訊示意圖
image.png
socket是跨平臺(tái)的,無論什么平臺(tái)(Android, ios ,c++...) 底層通訊都是??圖(此圖乃真理也,經(jīng)久不衰)

二厕隧、擼代碼

  • 核心代碼
    socket即網(wǎng)絡(luò), 這就是咱所用網(wǎng)絡(luò)(?NSURLSession/Connection/AFN...等)最底層代碼了
// 創(chuàng)建
int socket(int domain, int type, int protocol);  
// 連接
int connect(int, const struct sockaddr *, socklen_t) __DARWIN_ALIAS_C(connect);  
// 發(fā)送數(shù)據(jù)
ssize_t send(int, const void *, size_t, int) __DARWIN_ALIAS_C(send);  // void * 萬(wàn)能指針
// 讀取數(shù)據(jù)
ssize_t recv(int, void *, size_t, int) __DARWIN_ALIAS_C(recv);
// 關(guān)閉連接
int close(int);
  • socket連接成功

      • image.png
  • 步驟簡(jiǎn)單:
    1.敲下??圖中代碼(設(shè)置本機(jī)12345 端口號(hào))
    2.終端命令行使 始終監(jiān)聽本地計(jì)算機(jī)12345端口的數(shù)據(jù) ??

    $ nc -lk 12345
    
    Netcat , 終端下 用于調(diào)試檢查網(wǎng)絡(luò)的工具包,可用于創(chuàng)建TCP/IP連接
    

    3.run

懶人copy的如下??

// 頭文件引入
import <sys/socket.h>  // socket
#import <netinet/in.h>  // 互聯(lián)網(wǎng)
#import <arpa/inet.h>   // 互聯(lián)網(wǎng)參數(shù)
    // 1. 創(chuàng)建socket
    /**
         domain:    協(xié)議域 AF_INET -> IPV4
         type:      socket類型 ,SOCK_STREAM -> TCP , SOCK_DGRAM -> UDP
         protocol:  IPPROTO_TCP, 如果0 , 自動(dòng)選擇,根據(jù)上個(gè)(第二個(gè))參數(shù)而定
     
         return:    socket
     */
    int clientSocket = socket(AF_INET, SOCK_STREAM, 0); // 6
    
    // 2. 連接
    /** 
        client socket:
        (地址)指針:           指向 結(jié)構(gòu)體sockaddr (目標(biāo)(server)的 port ip)
        結(jié)構(gòu)體數(shù)據(jù)長(zhǎng)度:
     
        return:             0 成功
     */
    struct sockaddr_in serverAddr;
    serverAddr.sin_port = htons(12345); // htons 該宏 專用于寫 端口號(hào)    // 20480(高地位互換)
    serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 底層ip地址也是一串二進(jìn)制
    int connResult = connect(clientSocket, (const struct sockaddr *)&serverAddr, sizeof(serverAddr));
    if (connResult == 0) {
        NSLog(@"socket connet successfully");
    }else{
        NSLog(@"socket connet fail %zd",connResult);
        return;
    }
    // 3. 發(fā)送數(shù)據(jù)
    /** 
     參數(shù)
        client socket:
        發(fā)送內(nèi)容指針
        發(fā)送內(nèi)容長(zhǎng)度
        發(fā)送方式標(biāo)志, 一般為0
     返回值
        如果成功, 則返回字節(jié)數(shù)
     */
    NSString * msg = @"hello socket";
    //const char * msg1 = "hello socket 1";
    ssize_t sendLen = send(clientSocket, msg.UTF8String, strlen(msg.UTF8String), 0);
    NSLog(@"send %ld",sendLen);
    // 4. 讀取數(shù)據(jù)
    .
    .
    .  // 更多請(qǐng)去GitHub Demo
}
  • UI搭建

    image.png

三奔脐、拓展

  • 思考 :
    如何通過socket連接百度server呢? 直接將127.0.0.1換成www.baidu.com可以嗎?
  • 接下來, try一try~ ??圖
image.png
but:  發(fā)現(xiàn) 發(fā)送hello, 沒有響應(yīng), why ? (server根本看不懂 我發(fā)的"hello")
因?yàn)?  它是網(wǎng)頁(yè)請(qǐng)求, 需要使用http協(xié)議, socket是最底層的了,可沒有幫你封裝處理http . 
  • 看看網(wǎng)頁(yè)請(qǐng)求格式

    真正發(fā)送給服務(wù)器的數(shù)據(jù).png
    看到??request header, 這就是真正發(fā)送給服務(wù)器的數(shù)據(jù) 
    
  • 再 try ~
    將那些request header內(nèi)容 復(fù)制到 發(fā)送內(nèi)容中, 通過socket發(fā)送,即可收到server的response了


超懶人 點(diǎn)擊 github | <a >demo</a> 下載 調(diào)試 俄周。
祝愿有所收獲哦 ~ _ ~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市髓迎,隨后出現(xiàn)的幾起案子峦朗,更是在濱河造成了極大的恐慌,老刑警劉巖排龄,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件波势,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡橄维,警方通過查閱死者的電腦和手機(jī)艰亮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來挣郭,“玉大人迄埃,你說我怎么就攤上這事《艺希” “怎么了侄非?”我有些...
    開封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)流译。 經(jīng)常有香客問我逞怨,道長(zhǎng),這世上最難降的妖魔是什么福澡? 我笑而不...
    開封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任叠赦,我火速辦了婚禮,結(jié)果婚禮上革砸,老公的妹妹穿的比我還像新娘除秀。我一直安慰自己,他們只是感情好算利,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開白布册踩。 她就那樣靜靜地躺著,像睡著了一般效拭。 火紅的嫁衣襯著肌膚如雪暂吉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天缎患,我揣著相機(jī)與錄音慕的,去河邊找鬼。 笑死挤渔,一個(gè)胖子當(dāng)著我的面吹牛肮街,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蚂蕴,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼低散,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼俯邓!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起熔号,我...
    開封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤稽鞭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后引镊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體朦蕴,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年弟头,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了吩抓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡赴恨,死狀恐怖疹娶,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情伦连,我是刑警寧澤雨饺,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站惑淳,受9級(jí)特大地震影響额港,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜歧焦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一移斩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧绢馍,春花似錦向瓷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至舵稠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間入宦,已是汗流浹背哺徊。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留乾闰,地道東北人落追。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像涯肩,于是被迫代替她去往敵國(guó)和親轿钠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子巢钓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

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