美文网首页
socket-获取百度首页数据

socket-获取百度首页数据

作者: 小石头呢 | 来源:发表于2019-05-26 08:27 被阅读0次

一.两种架构


二.具体的响应过程

三.代码构建

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

相关文章

网友评论

      本文标题:socket-获取百度首页数据

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