IOS 網路基礎

來源:互聯網
上載者:User

標籤:

/*------------------------------------ 網路基礎: 1.位元據流 --------------------------------*/

<1>用戶端(Client):行動裝置(手機/iPad等手持功能).

    用戶端一般就是前端/前台等等.iOS,android開發都是前端開發.

    

    <2>伺服器(Server):為用戶端提供服務(比如資料/資源等)的機器---本質也是一台電腦(+伺服器軟體).

    伺服器開發就是後端/後台開發.java/php/.net等.

    

    <3>請求(Request):用戶端向伺服器索取資料.

    

    <4>響應(Response):伺服器對用戶端請求做出的反應,一般就是返回資料給用戶端.

    

    伺服器:按開發階段來分,分為兩種:

    

    遠程伺服器: 外網伺服器.應用上線之後供全體使用者使用的伺服器.速度取決於使用者的網速和伺服器的效能.

    

    本機伺服器: 內網伺服器,測試伺服器.開發測試階段使用的伺服器.供內部開發測試人員使用.速度飛快.

    

    2.網路中傳輸的都是位元據流. html/圖片/視頻資料...

    

    位元據流是如何被分組並傳輸的呢?

}

/*------------------------------------- 網路基礎: 2.七層協議  ---------------------------------*/

1.理解網路 2.理解七層協議/五層模型 3.理解Socket.

{

    應用程式層: 規定"應用程式"的資料格式. http / ftp /email 等.   //紙條上寫的是啥?

    

    傳輸層: 建立"連接埠"到"連接埠"之間的通訊. UDP/TCP 協議."連接埠". //我們幫你傳紙條

    

    網路層: 確定每一台電腦的位置,建立"主機"到"主機"之間的通訊.IPv4協議,"IP地址".   // 女孩的位置

    

    資料連結層: 確定1和0的分組方式.乙太網路協議:一組電訊號就是一個資料包."MAC地址"/網卡/廣播. // 深情告白

    

    物理層: 將電腦串連入網路,傳輸電訊號1和0.      // 一張白紙

    

    互連網分層結構的好處:

    

        上層的變動完全不影響下層的結構.

    

    Socket : "主機 + 連接埠"就是"Socket(通訊端/插座)"  ----- TCP/IP協議

}

/*----------------------------------  網路基礎: 3.資料包/流 ----------------------------------*/

1.理解資料包. 2.理解網路通訊實質.

{

    網路通訊的基礎: 知道對方的MAC地址和IP地址.

    

    網路通訊的實質: 互相交換資料包.

    

    資料包:

        每一個資料包都包含 "標題"和"資料"兩個部分."標題"包含本資料包的一些說明."資料"則是本資料包的內容.

    

    乙太網路資料包: 最基礎的資料包.標題部分包含了通訊雙方的MAC地址,資料類型等. ‘標題‘長度:18位元組,‘資料‘部分長度:46~1500位元組.

    

    IP資料包: 標題部分包含通訊雙方的IP地址,協議版本,長度等資訊.  ‘標題‘長度:20~60位元組,"資料包"總長度最大為65535位元組.

    

    TCP/UDP資料包:標題部分包含雙方的發出連接埠和接收埠.  UDP資料包:‘標題‘長度:8個位元組,"資料包"總長度最大為65535位元組,正好放進一個IP資料包.  TCP資料包:理論上沒有長度限制,但是,為了保證網路傳輸效率,通常不會超過IP資料長度,確保單個包不會被分割.

    

    應用程式資料包: 標題部分規定應用程式的資料格式.資料部分傳輸具體的資料內容.

    

    嵌套:

        資料包層層嵌套,上一層資料包嵌套在下一層資料包的資料部分.最後通通由乙太網路資料包來進行資料傳遞.

    

    分包/拆包:

        一般傳遞的資料都比較大,會將資料包分割成很多個部分來傳遞.

    

    拼包:

        將接收到資料包按序號拼接起來,組成完整的資料包.

    

}

/*----------------------------------  網路基礎: 4.IP地址    ----------------------------------*/

瞭解IP地址.

{

    靜態IP地址:

        固定不變的IP地址,需要使用者自己手動設定.

    

    動態IP地址:

        通過DHCP協議自動產生的IP地址.

    

    DHCP協議:

        通過DHCP協議,使用者獲得原生動態IP地址,子網路遮罩,網關,DNS伺服器等.

    

    子網路遮罩:

        與IP地址配合使用判斷兩台電腦是否位於同一個子網路.

    

    DNS伺服器:

        可以將網域名稱(網址)轉換成IP地址.

    

}

/*----------------------------------  網路基礎: 4.一個HTTP請求 --------------------------------*/

瞭解一個HTTP請求的完整過程.

{

 

    1. URL(Uniform Resource Locator):

        統一資源定位器.URL就是資源的地址,位置.通過一個URL能夠找到互連網上唯一的一個資源.

    

    URL的基本格式:  協議://主機地址/路徑

    

    協議:不同的協議代表不同的資源尋找方式,資源傳輸方式.

    {

        URL中的常見協議:

        

        <1>HTTP:超文字傳輸通訊協定 (HTTP),在網路開發中最常用的協議.訪問的是遠端網路資源.格式:http://...

        

        <2>file:訪問的時本機電腦上的資源.格式:file://(不要再加主機地址了)

        

        <3>FTP:訪問的是共用主機的檔案資源.格式:ftp://

        

        <4>mailto:訪問的是電子郵件地址.格式:mailto:

    }

    

    主機地址:存放資源的主機IP地址(網域名稱).

    

    路徑:資源在主機中得具體位置.

    

    2. HTTP請求的完整過程:

    

    <1> 請求: 用戶端發出請求.向伺服器索要資料(操作資料).

    

    <2> 響應: 伺服器對用戶端的請求做出響應.返回用戶端所需要的資料.

    

    3. 封裝一個HTTP請求

    

    用 NSURLRequest 來封裝一個HTTP請求.可以指定緩衝策略和逾時時間.

    

    1> 緩衝策略的選擇:NSURLRequestCachePolicy

    {

        NSURLRequestUseProtocolCachePolicy = 0,

        // 預設的緩衝策略,使用協議定義.

        

        NSURLRequestReloadIgnoringLocalCacheData = 1,

        // 忽略本機快取,直接從原始伺服器位址下載.

        

        NSURLRequestReturnCacheDataElseLoad = 2,

        // 只有在緩衝中不存在資料時,才從原始地址下載

        

        NSURLRequestReturnCacheDataDontLoad = 3,

        // 只使用快取資料,如果不存在緩衝,則請求失敗. 用於沒有網路連接的離線模式

        

        NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4,

        // 忽略遠程和本地的資料緩衝,直接從原始地址下載

        

        NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData = 1,

        // 忽略緩衝,直接從原始伺服器位址下載.

        

        NSURLRequestReloadRevalidatingCacheData = 5,

        // 驗證本機資料和遠端資料是否相同,如果不同則下載遠端資料,否則使用本機資料.

        

    }

 

/*----------------------------------- 網路基礎: 5.Socket演練 ---------------------------------*/

"理解"什麼是Socket.

{

    0.

    nc -lk 連接埠號碼 :始終監聽本機電腦此連接埠的資料.

    

    

    1.匯入三個標頭檔

    {

        #import <sys/socket.h>

        #import <netinet/in.h>

        #import <arpa/inet.h>

    }

    

    2.Socket書寫步驟

    {

        1.建立用戶端Socket            socket(<#int#>, <#int#>, <#int#>);

        2.建立伺服器Socket            struct sockaddr_in serverAddress;

        3.串連到伺服器(Socket編程)     connect(<#int#>, <#const struct sockaddr *#>, <#socklen_t#>);

        4.發送資料給伺服器             send(<#int#>, <#const void *#>, <#size_t#>, <#int#>)

        5.接收伺服器返回的資料          recv(<#int#>, <#void *#>, <#size_t#>, <#int#>)

        6.關閉 Socket                close(socketNumber)

    }

 

    /*

     建立用戶端 Socket.

     三個參數: domain:網路地址類型 type:連接埠類型 protocal:傳輸協議

     

     domain:協議域 指定socket主機地址類型. 網路層協議 AF_INET/IPv4協議; AF_INET_6/IPv6協議

     

     type:指定Socket連接埠類型. 指定傳輸層協議類型(TCP/UDP),SOCK_STREAM(TCP/流) ,SOCK_DGRAM(UDP/報文頭)

     

     protocal:指定傳輸協議:常用協議:IPPROTO_TCP、IPPROTO_UDP等,分別對應TCP傳輸協議、UDP傳輸協議.

     

     最後一個參數傳0,會根據第二個參數,自動選擇第二個參數對應的協議.

     

     傳回值:如果 > 0 表示成功.

     */

    

    // 0.建立用戶端 Socket.

    int socketNumber = socket(AF_INET, SOCK_STREAM, 0);

    

    if (socketNumber > 0) {

        NSLog(@"Socket建立成功:%d",socketNumber);

    }else{

        NSLog(@"Socket建立失敗");

    };

    

    /*

     串連到伺服器.

     三個參數:

     

     1.用戶端socket.

     2.接收方的socket參數.

     3.資料長度.

     

     傳回值: 0 表示成功,其他: 錯誤代號.

     */

 

 // 1.伺服器socket

    struct sockaddr_in serverAddress;

    // IPv4協議.

    serverAddress.sin_family = AF_INET;

    // 接收方(伺服器)IP地址.

    serverAddress.sin_addr.s_addr = inet_addr("127.0.0.1");

    // 連接埠號碼.

    serverAddress.sin_port = htons(56789);

    

    

    // 2.串連到伺服器

 

    // serverAddress 的資料長度.

    socklen_t length = sizeof(serverAddress);

    // 串連伺服器.

    // 在C語言中,傳遞結構體的時候,會指定結構體的長度

    // &取的是資料的起始位置,只有傳遞一個資料的長度,才能夠保證拿到完整的結構體資料.

    // 傳回值:0成功,其他都是失敗.

    int connection = connect(socketNumber, (const struct sockaddr *)&serverAddress,length);

    

    if (!connection) {

        NSLog(@"串連成功%d",connection);

    }else{

        NSLog(@"串連失敗");

    }

    

    /*

     發送訊息到伺服器

     參數:

     1> 用戶端Socket.

     2> 發送內容地址.

     3> 發送內容長度.

     4> 發送方式標識,一般為0.

     

     */

    

    // 3.發送訊息到伺服器

    

    // 發送訊息內容

    NSString *msg = @"hello socket!";

    

    msg.length :表示的是OC字串的長度.

    msg.UTF8String :將OC字串轉換成 UTF8 的 ASCII 碼,一個漢字需要佔用3個位元組的長度.

    strlen :計算所有 ASCII 碼的長度.

    

    // 發送訊息

    ssize_t result = send(socketNumber, msg.UTF8String, strlen(msg.UTF8String), 0);

    

    NSLog(@"result = %ld",result);

    

    /*

     接收伺服器接返回的訊息

     參數:

     1> 用戶端Socket.

     2> 接收內容緩衝區.

     3> 接收內容緩衝區長度.

     4> 接收方式.0表示阻塞式.必須等待伺服器返回資料.

     

     傳回值:

     如果成功,則返回接收到的位元組數.失敗則返回SOCKET_ERROR

     

     */

    

    // 4.伺服器接收訊息

    

    // 建立接收內容緩衝區.

    uint8_t buffer[1024];

    // 接受訊息

    ssize_t len = recv(socketNumber, buffer, sizeof(buffer), 0);

    

    NSLog(@"len: %zd",len);

    // 取出接受內容緩衝區中的資料.

    NSData *data = [NSData dataWithBytes:buffer length:len];

    // 將二進位流資料data轉換成字串類型.

    NSString *receive = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

    NSLog(@"receive:%@",receive);

    

    // 5.關閉Socket

    close(socketNumber);

}

 

IOS 網路基礎

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.