自己使用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.效果展示