44、HTML与HTTP服务器交互笔记

HTML与HTTP服务器交互笔记

一、Text类型(HTML)处理

  1. Content-Type设置

    服务器通过send_head函数为HTML文件设置Content-Type: text/html;charset=utf-8,确保中文正常显示(如01.html中的"展望2026,中国房地产政策..."等中文内容)。

    代码片段:

    c 复制代码
    case FILE_HTML:
        http_cmd[2] = "Content-Type: text/html;charset=utf-8\r\n";
        break;
  2. HTML文件功能

    • 03.html:登录表单页,通过form标签提交数据到/login路径,包含用户名(username)和密码(userpass)输入框。
    • 01.html:登录成功页,包含文本、标题、列表、图片引用(1.jpg、2.png)、超链接等HTML元素。
    • 02.html:跳转页,背景色为红色,可通过01.html的"go to 2"链接访问。
    • 04.html:登录失败页,显示"密码错"提示。

二、JPEG类型处理

  1. 识别与响应

    服务器通过判断URL后缀(.jpg)识别JPEG文件,设置Content-Type: image/jpeg,并发送对应文件(如01.html中引用的1.jpg)。

    代码片段:

    c 复制代码
    else if (strlen(url) > 4 && 0 == strcmp(&url[strlen(url) - 4], ".jpg"))
    {
        send_file(conn, url + 1, FILE_JPG); // url+1去除前缀"/",直接访问文件名
    }
  2. 注意事项

    • 需确保JPEG文件(如1.jpg)与服务器程序在同一目录,否则open函数会报错。
    • 服务器通过file_size函数获取文件大小,并在响应头中设置content-length,便于客户端接收完整文件。

三、短对话(单次请求-响应)

  1. 交互流程

    客户端(浏览器)与服务器的交互为"短对话"模式:

    • 客户端发送HTTP请求(如GET /login?username=zhangsan&userpass=123 HTTP/1.1)。
    • 服务器解析URL,验证参数后返回对应文件(01.html或04.html)。
    • 响应完成后,服务器通过close(conn)关闭连接(Connection: keep-closed)。
  2. 代码实现

    主循环中accept接收连接后,处理请求并立即关闭连接:

    c 复制代码
    while (1)
    {
        int conn = accept(listfd, (SA)&cli, &len);
        // 处理请求(recv、解析URL、send_file)
        close(conn); // 短对话:一次请求后关闭连接
    }

四、长对话(持久连接)

  1. 当前限制

    现有代码未实现长对话,因响应头设置Connection: keep-closed,且每次请求后主动关闭连接。

  2. 实现思路

    若需支持长对话(同一连接处理多次请求),需修改:

    • 响应头设置Connection: keep-alive。
    • 服务器不立即关闭conn,而是在循环中持续接收该连接的请求(直到客户端断开)。
      示例伪代码:
    c 复制代码
    // 修改send_head中的Connection
    http_cmd[4] = "Connection: keep-alive\r\n";
    
    // 处理连接时使用循环接收多次请求
    while (1) {
        int ret = recv(conn, buf, sizeof(buf), 0);
        if (ret <= 0) break;
        // 解析并处理请求...
    }
    close(conn);

五、总结

  • 服务器通过URL解析区分请求类型(HTML、JPG、PNG等),并设置正确的Content-Type。
  • 短对话适用于简单请求,实现简单但效率较低;长对话需持久连接,适合多次连续请求(如页面包含多个图片资源)。
  • HTML文件通过表单、超链接等元素与服务器形成交互闭环(如登录流程)。
相关推荐
QYR-分析6 分钟前
26.2% 高增!场内及园区无人物流车,厂内短驳自动化的 L4 货运载体
运维·自动化
熊猫钓鱼>_>7 分钟前
鸿蒙 PC 三方库适配复盘:libfvad 1.0 —— 把 WebRTC VAD 做成能装进采集链路的静态库
服务器·开发语言·华为·harmonyos·openharmony·适配·鸿蒙pc
用户83514140494914 分钟前
把日志和寄存器值喂给AI做故障定位,我的实际问法
linux·ubuntu
java_logo19 分钟前
Docker 部署 DPanel:轻松搭建轻量容器管理平台
运维·docker·容器·podman·容器管理·dpanel·轩辕镜像
时间售卖铺26 分钟前
Oracle DQL精髓:从基础到高级实战
运维·数据库·云原生·oracle
分布式存储与RustFS33 分钟前
CI 老被 Docker Hub 的 429 卡住,自建 Registry 把镜像搬进内网
运维·docker·开源·镜像仓库·对象存储·ci·rustfs
Ruiery38 分钟前
Linux 6.6内核内存管理深度解析(十七):vmalloc — 内核要“虚拟连续“就够:物理页逐个凑,页表来连
linux·运维·服务器
pt104340 分钟前
Cisco设备网络安全系列-19:网络安全事件驱动与调整
运维·网络
Escalating_xu44 分钟前
【Linux 网络编程】ARP 的具体过程与 ARP 欺骗:一条 IP → MAC 映射,怎样改变数据的去向?
linux·网络·tcp/ip
sxgzzn1 小时前
如何利用无人机提升光伏巡检效率?
运维·重构·无人机·开关柜局放在线监测·光伏运维管理系统