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

自己使用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.效果展示
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43733988/article/details/90486673