博客> 网络 HTTP协议
网络 HTTP协议
2017-08-20 07:07 评论:0 阅读:273 小白进化史
ios 网络 HTTP协议

Tip1:HTTP简介 1.定义:超文本传输协议(HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有WWW文件都必须遵守这个标准。基于TCP/IP协议。 2.特点 (1)支持客户/服务器模式 (2)简单快速:只需要传输请求方法和路径。 (3)灵活:HTTP允许传输任意类型的数据对象。 (4)无连接:限制每次连接只处理一个请求。 (5)无状态:对于事物处理没有记忆能力。 (6)分段传输数据 3.使用步骤 (1)客户机与服务器建立连接。 (2)建立连接后,客户机发送一个请求给服务器。 (3)服务器接到请求后,给予相应的响应信息。 (4)客户端接收到服务器所返回的信息后通过浏览器显示在用户的显示器上。断开连接。

4.HTTP的请求响应模型 HTTP协议永远都是客户端发起请求,服务器回送响应。当需要服务器主动发送时属于后台推送,不属于HTTP协议内容。

 76DB3B02-90AB-4EAE-8B51-3B7E68694B75.png

5.重要概念 (1)Connection 连接 (2)Message 消息 :HTTP通信的基本单位。 (3)Request 请求 :(客户端—>服务器)请求信息包括应用于资源的方法、资源的标识符和协议的版本号。 (4)Response 响应:(服务器—>客户端) 返回的信息包括HTTP协议的版本号、请求的状态和文档的MIME类型。 (5)Resource 资源: 由URI标识的网络数据对象或者服务。 (6) Entity 实体:一个实体包括实体头信息和实体本身内容。 (7) Client 客户机 (8) UserAgent 用户代理: 浏览器、编辑器或者其他用户工具。 (9) Server 服务器: 一个接受连接并对请求返回信息的应用程序。 (10)Originserver 源服务器:一个给定资源可以在其上驻留或被创建的。 (11)Proxy 代理:一个中间程序,它可以充当一个服务器也可以充当一个客户机,为其它客户机建立请求。 (12)GateWay 网关: (13)Tunnel通道:是作为两个连接中继的中介程序。一旦激活,通道便被认为不属于HTTP通讯,尽管通道可能是被一个HTTP请求初始化的。当被中继的连接两端关闭时,通道消失。 (14)Cache 缓存:反应信息的局域存储。1. list text here 其他: 门户(Portal)、中介(Intermediary) Tip2:HTTP请求详解 1.组成 请求行、请求头、请求正文 2.请求方式 (1)POST 向指定资源提交数据进行处理请求,数据被包含在请求体中。 (2)GET 向指定的资源发出请求。 url 包括地址和端口号(若没有值默认为80) 接收到的数据都是成段的,需要拼接起来。

//服务器端 +(void)serviceSocketWithPort:(int)port blockStr:(MyBlock)block { //获取全局队列 dispatch_queue_t globle = dispatch_get_global_queue(0, 0);

//添加任务到队列
dispatch_async(globle, ^{

    /*服务器端
     1.创建Socket socket()
     2.绑定IP地址 bind()
     3.监听listen() ---- 同意接收 accept()
     4.建立连接后通信 recv() send()
     5.关闭 close()
     */
    //1.创建socket
    serviceSocketId = socket(AF_INET, SOCK_STREAM, 0);

    NSLog(@"serviceSocketId is:%d",serviceSocketId);

    if (!serviceSocketId) {
        return;
    }

    //2.绑定

    struct sockaddr_in addr;

    //初始化变量
    memset(&addr, 0, sizeof(addr));

    addr.sin_family = AF_INET;

    addr.sin_port = htons(port);

    addr.sin_addr.s_addr = htonl(INADDR_ANY);

    int bindId = bind(serviceSocketId, (struct sockaddr *)&addr, sizeof(addr));

    if (bindId == -1) {
        NSLog(@"bind error");
    }

    //3.监听
    int listenId = listen(serviceSocketId, 10);

    if (listenId == -1) {
        NSLog(@"listen error");
    }
    while (1) {
        //接受操作 将返回新的socketId
        int acceptId = accept(serviceSocketId, NULL, NULL);

        if (!acceptId) {
            NSLog(@"accept error");
            //跳出本次循环
            continue;
        }

        //创建数据接收容器
        char *str = malloc(1000);

        //接收数据
        long recvId = recv(acceptId, str, 1000, 0);

        if (recvId==-1) {
            NSLog(@"recv error");
        }

        //将C字符串转化为OC字符串
        NSString *blockStr = [NSString stringWithCString:str encoding:NSUTF8StringEncoding];

        //回调字符串
        block(blockStr);

        //关闭新的socketId
        close(acceptId);

    }

});

}

//客户端 +(void)clientSocketWithPort:(int)port ip:(NSString )ip msg:(NSString )msg {

/*客户端
 1.创建socket socket()
 2.连接服务器 connect()
 3.建立通信后 消息的读取或发送 recv() send()
 4.关闭close()
 */

//获取系统全局队列
dispatch_queue_t globle = dispatch_get_global_queue(0, 0);

dispatch_async(globle, ^{

    //1.创建socket
    clientSocketId = socket(AF_INET, SOCK_STREAM, 0);

    NSLog(@"clientSocketId is:%d",clientSocketId);

    if (!clientSocketId) {
        return ;
    }

    //2.连接服务器
    struct sockaddr_in addr;

    //初始化
    memset(&addr, 0, sizeof(addr));

    addr.sin_family = AF_INET;

    addr.sin_port = htons(port);

    //将OC字符串转化为C字符串
    const char *cIp = [ip UTF8String];

    inet_pton(AF_INET, cIp, &addr.sin_addr);

    int connectId = connect(clientSocketId, (struct sockaddr *)&addr, sizeof(addr));

    if (connectId == -1) {
        NSLog(@"connect error");
    }

    //将oc字符串转化为c字符串
    const char *str = [msg UTF8String];

    //发送字符串
    send(clientSocketId, str, strlen(str), 0);

   //创建可变字符串
    NSMutableString *string = [NSMutableString string];

    BOOL isOK;

    while (!isOK) {

        //接收服务器返回的数据

        char *recvStr = malloc(500000);

        /*
         如果recvId大于0:则还有数据传递
         如果recvId等于0:则数据传递完毕
         如果recvId小于0:传数据出错
         */

        long recvId = recv(clientSocketId, recvStr, 500000, 0);

        //将获取的数据拼接到string中
        [string appendFormat:@"%s",recvStr];

        if (recvId == 0) {
            isOK = YES;
        }
    }

    NSLog(@"string is:%@",string);

    //关闭客户端socketId
    close(clientSocketId);
});

}

+(void)analysisWithUrl:(NSURL )url { //获取host NSString host = url.host;

//获取端口号
NSNumber *port = url.port;

//解析域名
struct hostent *hostName = gethostbyname([host UTF8String]);

//转化地址链表
struct in_addr **addrList = (struct in_addr**)hostName->h_addr_list;

//打印地址
for (int i=0; addrList[i]!=NULL; i++) {

    NSLog(@"ip is:%s",inet_ntoa(*addrList[i]));
}

//获取IP地址
NSString *ip = [NSString stringWithCString:inet_ntoa(*addrList[0]) encoding:NSUTF8StringEncoding];

//设置端口号
if (!port) {
    port = @80;
}

//请求信息
NSString *msg = [Socket getMsg:url];

//创建客户端发送请求
[Socket clientSocketWithPort:[port intValue] ip:ip msg:msg];

}

//拼接请求信息 +(NSString )getMsg:(NSURL )url { //拼接请求信息 \r\n == 换行 NSString *sendMsg = [NSString stringWithFormat:@"GET %@ HTTP/1.1\r\n",url.path];

sendMsg = [sendMsg stringByAppendingFormat:@"Host: %@\r\n",url.host];

sendMsg =[sendMsg stringByAppendingString:@"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n\r\n"];

sendMsg =[sendMsg stringByAppendingString:@"Content-Encoding: utf-8\r\n"];
sendMsg =[sendMsg stringByAppendingString:@"User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:25.0) Gecko/20100101 Firefox/25.0\r\n"];
sendMsg =[sendMsg stringByAppendingString:@"Connection: close\r\n"];

return sendMsg;

}

Tip4:项目开发与测试 1.安装并配置一个本地的ejabberd服务器,创建一个admin用户并为其添加好友。 2.创建XMPP即时通信项目。 3.用MAC自带的信息中的客户端登陆admin用户下的一个好友:Mary,好友列表中该用户状态由离线变为在线。

收藏
0
sina weixin mail 回到顶部