网络篇——socket获取百度页的数据

    xiaoxiao2022-07-13  151

    自己使用socket封装请求数据 获取百度网页的数据

    1.导入头文件

    #import <sys/socket.h> #import <netinet/in.h> #import <arpa/inet.h> #import <sys/types.h>

    2.创建客户端socket

    int clientSocket = socket(AF_INET, SOCK_STREAM, 0); if (clientSocket == -1) { NSLog(@"创建socket失败"); }else{ NSLog(@"创建socket成功"); }

    3.创建结构体变量 struct socketAddr_in

    终端输入ping www.baidu.com,得到www.baidu.com的IP地址 struct sockaddr_in serviceAddr; serviceAddr.sin_family = AF_INET;//使用ipv4协议 serviceAddr.sin_port = htons(80);//端口号 serviceAddr.sin_addr.s_addr = inet_addr("61.135.169.125");//具体的ip地址 www.baidu.com

    4.连接服务器

    int result = connect(clientSocket, (const struct sockaddr *)&serviceAddr, sizeof(serviceAddr)); if (result == -1) { NSLog(@"连接服务器失败"); }else{ NSLog(@"连接服务器成功"); }

    5.发送数据请求

    发送的数据是这个请求的头部信息http协议的header,行与行之间通过\r\n分割,头部的最后一行有两个\r\n //拼接请求头部信息 char *request = "GET / HTTP/1.1\r\n""Host: www.baidu.com\r\n\r\n"; //发送数据请求 size_t len = send(clientSocket, request, strlen(request), 0); NSLog(@"成功发送 %zd 字节",len);

    6.接收数据请求

    NSMutableData *mData = [NSMutableData data]; while (1) { char buff[1024]; len = recv(clientSocket, buff, 1024, 0); NSLog(@"成功接收 %zd 字节",len); [mData appendBytes:buff length:len]; if (len < 1024) { break; } }

    7.将C语言字符串转化为OC的NSString对象

    NSString *str = [[NSString alloc]initWithData:mData encoding:NSUTF8StringEncoding]; NSLog(@"接收的字符串为:%@",str);

    8.获取头部信息之后的网页数据

    NSRange range = [str rangeOfString:@"\r\n\r\n"]; NSString *html = [str substringFromIndex:range.location + range.length]; NSLog(@"获取的网页数据:%@",html);

    9.使用UIWebView显示百度页面

    NSURL *url = [NSURL URLWithString:@"www.baidu.com"]; NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url]; UIWebView *webView = [[UIWebView alloc] initWithFrame:self.view.bounds]; [webView loadHTMLString:html baseURL:urlRequest]; [self.view addSubview:webView];

    10.由于百度网页用的是https协议,所以要支持http协议,在info.plist文件中添加配置 11.效果展示

    最新回复(0)