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;

}
相关推荐
DFT计算杂谈6 分钟前
无 Root 权限在 Tesla K80 零门槛部署 DeepSeek 大模型
linux·服务器·网络·数据库·机器学习
中微极客2 小时前
2026主流AI Agent框架技术选型与性能对比
运维·网络·人工智能
猿的天空6 小时前
机器人双手迎来全栈训练系统:灵初智能EgoSteer让灵巧手无所不能
网络·人工智能·计算机·ai·程序员·机器人·编程
Xzaveir_7776 小时前
OPPO、vivo、荣耀号码认证:多终端拨测矩阵与异常复现
大数据·网络·科技·矩阵·产品经理·ai-native
wuqingshun3141596 小时前
从网络角度来看,用户从输入网址到网页显示,期间发生了什么?
网络
牛马工作号6 小时前
Zigbee 专业详解:从协议到排障
网络·物联网·安全
牛马工作号6 小时前
Wi‑Fi 完全指南:从 802.11 协议到 Wi‑Fi 7、AC+AP 与 Mesh 工程组网
网络·网络协议·智能路由器
智慧光迅AINOPOL7 小时前
智慧工厂全光网怎么扛住AGV与强电磁?光电复合缆与工业级方案
网络·全光网解决方案·全光网·酒店全光解决方案·泛住宿全光网解决方案
JoyCong19987 小时前
手机变身“司令台”!ToDesk AI安卓版上线
网络·人工智能·科技·智能手机·电脑·远程工作·远程操作
a4493153627 小时前
iPhone 基带故障诊断——无服务/搜索不到网络的芯片级维修实录
网络·macos·ios·电脑·iphone