美文网首页
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