美文网首页Network
iOS 开发 网络编程详解之Socket详解

iOS 开发 网络编程详解之Socket详解

作者: 程序员_秃头怪 | 来源:发表于2019-05-25 20:23 被阅读6次

    Socket基本概念

    • 建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装.

    • Socket实质上提供了进程通信的端点。进程通信之前,双方首先必须各自创建一个端点,否则是没有办法建立联系并相互通信的。

    通讯示意图

    通讯原理图

    Socket模拟网络通信

    注意 :

    • 服务器返回数据不一定是一次性就返回完的,可能是一点一点的返回的,所以我们接受数据时需要创建一个循环,循环的去接受服务器每次返回到客户端的数据.

    • 当最后一次返回数据为0时,说明数据已经返回完成了.

    • 使用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连接。

    Socket连接与HTTP连接

    • 由于通常情况下Socket连接就是TCP连接,因此Socket连接一旦建立,通信双方即可开始相互发送数据内容,直到双方连接断开。但在实际网络应用 中,因网关、防火墙等导致 Socket 连接断连,因此需要通过轮询告诉网络,该连接处于活跃状态。

    • 而HTTP连接使用的是“请求—响应”的方式,不仅在请求时需要先建立连接,而且需要客户端向服务器发出请求后,服务器端才能回复数据。
      1>很 多情况下,需要服务器端主动向客户端推送数据,保持客户端与服务器数据的实时与同步。
      2>此时若双方建立的是Socket连接,服务器就可以直接将数据传送给 客户端;
      3>若双方建立的是HTTP连接,则服务器需要等到客户端发送一次请求后才能将数据传回给客户端,因此,客户端定时向服务器端发送连接请求,不仅可以 保持在线,同时也是在“询问”服务器是否有新的数据,如果有就将数据传给客户端。

    参考:http与socket连接区别
    (原文作者:上进求知,认真思辨)

    相关文章

      网友评论

        本文标题:iOS 开发 网络编程详解之Socket详解

        本文链接:https://www.haomeiwen.com/subject/pdfzzqtx.html