iOS网络编程详解之Socket、http、tcp详解

建立网络通信连接至少要一对端口号(Socket).Socket本职是编程接口(API),对TCP/IP的封装,实质上提供了进程通信的端点。进程通信之前,双方首先必须各自创建一个断点,否则是没有办法建立联系并相互通信的。
通讯示意图
这里写图片描述
通讯原理图
这里写图片描述
Socket模拟网络通信 注意:
服务器返回数据不一定是一次性就返回完的,可能是一点一点的返回的,所以我们接受数据时需要创建一个循环,循环的去接受服务器每次返回到客户端的数据。
使用Socket就不需要设置ATS。因为Socket是底层的实现。
Socket使用步骤:

1.创建客户端Socket
2.连接到服务器Socket
3.客户端Socket发送数据到服务器Socket
4.客户端Socket接收服务器返回的数据
5.关闭客户端Socket
#import"ViewController.h"
#import <sys/socket.h>
#import <netinet/in.h>
#import <arpa/inet.h>
@interface ViewController()
@end
@implementation ViewController
- (void)viewDidLoad{
    [super viewDidLoad];
    //1.创建客户端Socket
    /**
    参数1:domain,协议域、协议簇,AF_INET(IPV4的网络开发)
    参数2:type,Socket类型,SOCK_STREAM(TCP)/SOCK_DGRAM(UDP,报文)
    参数3:protocol,IPPROTO_TCP,协议,如果输入0,可以根据第二个参数,自动选择协议
    返回值
    int类型,如果>0就表示创建客户端Socket成功,返回socket
    */
       int clientSocket = socket(AF_INET, SOCK_STREAM, 0);
    if (clientSocket > 0) {
        NSLog(@"创建客户端Socket成功");
    }

    // 2.客户端Socket连接到服务器Socket
    /**
     参数
     参数1 :  客户端socket
     参数2 :  指向数据结构sockaddr的指针,其中包括目的端口和IP地址
             服务器的"结构体"地址
             提示:C 语言中没有对象
     参数3 :  结构体数据长度

     返回值
         0 成功/其他 错误代号,(不是非0即真)
     */

    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(80);
    addr.sin_addr.s_addr = inet_addr("119.75.217.109");

    int isConnected = connect(clientSocket, (const struct sockaddr *)&addr, sizeof(addr));
    if (isConnected == 0) {
        NSLog(@"连接到服务器成功");
    }

    // 3.客户端Socket向服务器Socket发送请求
    /**
     参数
     参数1 : 客户端socket
     参数2 : 发送内容地址 void * == id
     参数3 : 发送内容长度
     参数4 : 发送方式标志,一般为0

     返回值
     如果成功,则返回发送的字节数,失败则返回SOCKET_ERROR
     */

    NSString *sendMsg = @"GET / HTTP/1.1\r\n"
                        "Host: www.baidu.com\r\n"
                        "User-Agent: iphone\r\n"
                        "Connection: close\r\n\r\n"
                        ;

    ssize_t sendCount = send(clientSocket, sendMsg.UTF8String, strlen(sendMsg.UTF8String), 0);
    NSLog(@"发送字符数 %ld",sendCount);

    // 4.客户端Socket接收服务器Socket发送的数据(响应)
    /**
     参数
     参数1 : 客户端socket
     参数2 : 接收内容缓冲区地址
     参数3 : 接收内容缓存区长度
     参数4 : 接收方式,0表示阻塞,必须等待服务器返回数据

     返回值
     如果成功,则返回读入的字节数,失败则返回SOCKET_ERROR

     提示 : 服务器发送给客户端数据时,是一点一点发送的
     提示 : 当服务器把数据都发送完了以后,再次发送时,只发送0字节,
     */

    // 创建接收服务器发送的数据的容器 / 缓冲区 ,并且指定了容量
    uint8_t buffer[1024];
    // 需要创建一个容器
    NSMutableData *dataM = [NSMutableData data];

    // 循环的接收服务器发送的数据
    ssize_t recvCount = -1;
    while (recvCount != 0) {
        // 值接收了一次
        recvCount = recv(clientSocket, buffer, sizeof(buffer), 0);
        NSLog(@"接收的内容数 %ld",recvCount);
        [dataM appendBytes:buffer length:recvCount];
    }
    NSString *html = [[NSString alloc] initWithData:dataM encoding:NSUTF8StringEncoding];
    NSLog(@"%@",html);

    // 5.关闭Socket
    close(clientSocket);
}
@end
}

Socket/TCP/HTTP联系与区别
Socket/TCP
Socket是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示。
为了区别不同的应用程序进程和连接,计算机操作系统为应用程序与TCP/IP协议交互提供了套装字(Socket)接口。应用层可以和传输层通过Socket接口,区分阿里自不同应用程序进程或网络连接时通信,实现数据传输的并发服务。

Socket连接与TCP连接
创建Socket连接时,可以指定使用的传输层协议,Socket可以支持不同的传输层协议(TCP或UDP),当使用TCP协议进行连接时,该Socket连接就是一个TCP连接。
手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使用手机终端通过无线网络建立TCP连接。TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在”无差别”的网络之上。
建立起一个TCP连接需要经过“3次握手”:
第一次握手:客户端发送syn包到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=syn+1),同时自己也发送一个SYN包,即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK,此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP连接都将被一直保持下去。断开连接时服务器和客户端均可以主动发起断开TCP连接的请求,断开过程需要经过“4次握手”,就是服务器与客户端交互,最终确定断开。

Socket连接与HTTP连接
由于通常情况下Socket连接就是TCP连接,因此Socket连接一旦建立,通信双方即可开始相互发送数据内容,知道双方连接断开。但在实际网络应用中,因网关、防火墙等导致Socket连接断连,因此需要通过论询告诉网络,该连接处于活跃状态。
而HTTP连接使用的“请求-响应”的方式,不仅在请求时需要先建立连接,而且需要客户端向服务器发出请求后,服务器端才能回复数据。
1.很多情况下,需要服务器端主动想客户端推送数据,保持客户端与服务器数据的实时与同步。
2.此时若双方建立的是Socket连接,服务器就可以直接将数据传送给客户端。
3.若双方建立的是HTTP连接,则服务器需要等到客户端发送一次请求后才能将数据传回给客户端,因此,客户端定时向服务器端发送连接请求,不仅可以保持在线,同时也是在“询问”服务器是否有新的数据,如果有就将数据传给客户端。
HTTP协议即超文本传输洗衣(Hypertext Transfer Protocol),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用。
HTTP连接最显著的特点是客户端发送的每次请求都需要服务器会送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。
由于HTTP在每次请求结束后都会主动释放连接,因此HTTP连接是一种“短连接”,要保持客户端程序的在线状态,需要不断的想服务器发起连接请求。通常的做法是即时不需要活的任何数据,客户端也保持每隔一段固定的时间向服务器发送一次“保持连接”的请求,服务器收到该请求后对客户端进行回复,表明知道客户端“在线”。若服务器长时间无法收到客户端的请求,则认为客户端“下线”,若客户端长时间无法收到服务器的回复,则认为网络已经断开。

猜你喜欢

转载自blog.csdn.net/zhfdbk/article/details/79526579