IOS 网络基础

/*------------------------------------ 网络基础: 1.二进制数据流 --------------------------------*/

<1>客户端(Client):移动设备(手机/iPad等手持设备).php

    客户端通常就是前端/前台等等.iOS,android开发都是前端开发.html

    

    <2>服务器(Server):为客户端提供服务(好比数据/资源等)的机器---本质也是一台计算机(+服务器软件).前端

    服务器开发就是后端/后台开发.java/php/.net等.java

    

    <3>请求(Request):客户端向服务器索取数据.android

    

    <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://...

        

        <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);

}

相关文章
相关标签/搜索