一.两种架构
二.具体的响应过程
三.代码构建
1.创建TCP套接字
int clientSocket = socket(AF_INET, SOCK_STREAM, 0);
//判断socket是否创建成功
if (clientSocket == -1) {
NSLog(@"创建socket失败");
}else{
NSLog(@"创建socket成功");
}
2.创建sockaddr_in结构体
struct sockaddr_in serviceAddr;
serviceAddr.sin_family = AF_INET;//IP类型
serviceAddr.sin_addr.s_addr = inet_addr("180.97.33.108");//IP地址
serviceAddr.sin_port = htons(80);//端口
这里的IP地址可以通过在终端ping www.baidu.com获取
3.创建连接
int result = connect(clientSocket, (const struct sockaddr *)&serviceAddr, sizeof(serviceAddr));
//判断服务器是否连接成功
if (result == -1) {
NSLog(@"连接服务器失败");
}else{
NSLog(@"连接服务器成功");
}
4.发送数据,请求信息
//发送的数据就是这个请求的头部信息
//HTTP协议header
//行与行之间通过\r\n分割
//头部的最后一行有两个\r\n\r\n
char *request = "GET / HTTP/1.1\r\n"
"Host: www.baidu.com\r\n\r\n";
size_t len = write(clientSocket, request, strlen(request));
NSLog(@"成功发送 %zd 字节",len);
5.接受数据
//定义NSMutableData接收所有数据
NSMutableData *mData = [NSMutableData data];
//保存每次传递的数据
char buff[1024];
//不停地接受数据
while (1) {
len = read(clientSocket, buff, 1024);
NSLog(@"成功接受 %zd 字节",len);
//追加
[mData appendBytes:buff length:len];
//判断是不是最后一次
if (len < 1024) {
break;
}
}
//将C语言字符串转化为OC的NSString对象
NSString *str = [[NSString alloc] initWithData:mData encoding:NSUTF8StringEncoding];
NSLog(@"接收的字符串为: %@", str);
6.解析HTML中的数据
//解析HTML中的数据
//responseHeader
NSRange range = [str rangeOfString:@"\r\n\r\n"];
NSString *html = [str substringFromIndex:range.location+range.length];
NSLog(@"获取的网页数据:%@",html);
7.使用UIWebView显示网页数据
方法一
NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
UIWebView *webView = [[UIWebView alloc] initWithFrame:self.view.bounds];
[webView loadHTMLString:html baseURL:url];
[self.view addSubview:webView];
方法二
NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
UIWebView *webView = [[UIWebView alloc] initWithFrame:self.view.bounds];
NSURLRequest *requestURL = [NSURLRequest requestWithURL:url];
[webView loadRequest:requestURL];
[self.view addSubview:webView];
8.如果出现错误,修改plist'文件里面的内容
四.运行结果
五.代码链接
工程链接:
https://pan.baidu.com/s/1R7ng8v1RFjkYAJRqS0EoRA
密码:0sj6
网友评论