http协议和HTTP编程流程

目录

1、http协议

(1)概念

(2)使用的端口

(3)长连接和短连接

(4)常见web服务器

2、https(443)

3、浏览器连接服务器编程


1、http协议

(超文本传输协议)(80)[应用层协议]

(1)概念

浏览器和web服务器在应用层通信使用的是http协议,HTTP协议在传输层使用的是TCP协议,浏览器和web服务区三次握手建立连接之后,才能发送HTTP请求报文,那么服务器收到请求报文之后,向浏览器回复http应答报文

(2)使用的端口

浏览器向服务器发起链接之前,需要得到服务器的IP和端口,使用TCP协议的程序一般默认使用80端口

(3)长连接和短连接

服务器与浏览器建立连接之后,如果两次以上的请求复用同一个TCP链接,就称为长连接,如果浏览器发送一次请求报文,服务器一次应答就断开,下次交互再重新进行三次握手连接,就称为短链接,长连接更好,减少网络中的同步报文,也使服务器的响应速度变快

(4)常见web服务器

Apache IIS Nginx Tomcat

2、https(443)

加密的,比http安全,ca证书

报头 空行(\r\n) 数据

3、浏览器连接服务器编程

复制代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include <arpa/inet.h>

int socket_init();
int main()
{
    int sockfd=socket_init();
    if(sockfd==-1)
    {
        printf("sockfd err\n");
        exit(1);
    }

    while(1)
    {
        struct sockaddr_in caddr;
        int len=sizeof(caddr);
        int c=accept(sockfd,(struct sockaddr*)&caddr,&len);
        if(c<0)
        {
            continue;
        }

        char buff[1024]={0};
        int n=recv(c,buff,1023,0);
        if(n<=0)
        {
            close(c);
            continue;
        }
        printf("%s",buff);

        send(c,"ok",2,0);
        close(c);

    }

}
int socket_init()
{
    int sockfd=socket(AF_INET,SOCK_STREAM,0);
    if(sockfd==-1)
    {
        return -1;
    }
    struct sockaddr_in saddr;
    memset(&saddr,0,sizeof(saddr));
    saddr.sin_family=AF_INET;
    saddr.sin_port=htons(80);
    saddr.sin_addr.s_addr=inet_addr("127.0.0.1");
    int res=bind(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));
    if(res==-1)
    {
        return -1;
    }

    res=listen(sockfd,5);
    if(res==-1)
    {
        return -1;
    }
    return sockfd;

}

回复浏览器,必须要满足他的格式

浏览器和服务器连接编程

复制代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include <arpa/inet.h>
#include<fcntl.h>

#define PATH "/home/qqq/c2202/day21"

int socket_init();
char*get_filename(char buff[])
{
    char*s=strtok(buff," ");
    if(s==NULL)
    {
        return NULL;
    }
    printf("qingqiufangfa:%s",s);

    s=strtok(buff," ");
    return s;

}
int main()
{
    int sockfd=socket_init();
    if(sockfd==-1)
    {
        printf("sockfd err\n");
        exit(1);
    }

    while(1)
    {
        struct sockaddr_in caddr;
        int len=sizeof(caddr);
        int c=accept(sockfd,(struct sockaddr*)&caddr,&len);
        if(c<0)
        {
            continue;
        }

        char buff[1024]={0};
        int n=recv(c,buff,1023,0);
        if(n<=0)
        {
            close(c);
            continue;
        }
        printf("%s",buff);
        char*filename=get_filename(buff);
        if(filename==NULL)
        {
            close(c);
            continue;
        }
        char path[256]={PATH};
        if(strcmp(filename,"/")==0)
        {
            strcat(path,"index.html");
        }
        else
        {
            strcat(path,filename);
        }

        int fd=open(path,O_RDONLY);
        if(fd==-1)
        {
            close(c);
            continue;
        }
        int size=lseek(fd,0,SEEK_END);
        lseek(fd,0,SEEK_SET);

        char head[128]={"http/1.1 200 ok\r\n"};
        strcat(head,"Sever: http\r\n");
        printf(head+strlen(head),"Content-Length: %d\r\n",size);
        strcat(head,"\r\n");
        
        printf("\n%s",head);
        send(c,head,strlen(head),0);
        char date[1024]={0};
        int num=0;
        while((num=read(fd,date,1024))>0)
        {
            send(c,date,num,0);
        }
        close(fd);
        close(c);

    }

}
int socket_init()
{
    int sockfd=socket(AF_INET,SOCK_STREAM,0);
    if(sockfd==-1)
    {
        return -1;
    }
    struct sockaddr_in saddr;
    memset(&saddr,0,sizeof(saddr));
    saddr.sin_family=AF_INET;
    saddr.sin_port=htons(80);
    saddr.sin_addr.s_addr=inet_addr("127.0.0.1");
    int res=bind(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));
    if(res==-1)
    {
        return -1;
    }

    res=listen(sockfd,5);
    if(res==-1)
    {
        return -1;
    }
    return sockfd;

}
相关推荐
二狗mao1 小时前
Uniapp使用websocket进行ai回答的流式输出
websocket·网络协议·uni-app
7***u2162 小时前
显卡(Graphics Processing Unit,GPU)架构详细解读
大数据·网络·架构
河北瑾航科技5 小时前
广西水资源遥测终端 广西水利遥测终端 广西用水监测遥测终端 河北瑾航科技遥测终端机HBJH-B01说明书
网络·科技·水文遥测终端机·遥测终端机·广西水资源遥测终端机·广西水利遥测终端·广西用水终端
羑悻的小杀马特5 小时前
轻量跨云·掌控无界:Portainer CE + cpolar 让远程容器运维像点外卖一样简单——免复杂配置,安全直达对应集群
运维·网络·安全·docker·cpolar
愚戏师6 小时前
Python3 Socket 网络编程复习笔记
网络·笔记
降临-max7 小时前
JavaSE---网络编程
java·开发语言·网络·笔记·学习
156082072197 小时前
基于7VX690T FPGA实现万兆TCP/IP资源和性能测试
网络协议·tcp/ip·fpga开发
赖small强7 小时前
【Linux 网络基础】libwebsockets HTTPS 服务端实现机制详解
linux·网络·https·tls·libwebsockets
大白的编程日记.8 小时前
【计算网络学习笔记】MySql的多版本控制MVCC和Read View
网络·笔记·学习·mysql
布朗克1689 小时前
HTTP 与 HTTPS 的工作原理及其区别
http·https