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.jpg2.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.html04.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文件通过表单、超链接等元素与服务器形成交互闭环(如登录流程)。
相关推荐
库玛西4 分钟前
深入浅出传输层:UDP 与 TCP 协议全景指南
linux·服务器·网络·c++·笔记·tcp/ip·udp
随便做点啥13 分钟前
32卡-64G-910B4-16后端-(Qwen3.8-27B-W8A8)集群部署报告
运维·服务器·经验分享·docker·vllm
薛定谔的悦4 小时前
储能 EMS 的功率策略:从一块电表到一次逆流的 200 毫秒
大数据·linux·能源·储能·bms
FreeTinker6 小时前
HTML本地存储技术解析:localStorage与sessionStorage的原理、差异与应用场景
前端·html
2601_962218476 小时前
万象生鲜系统区块链溯源技术帮助生鲜企业搭建食品安全数字化体系
大数据·运维·微服务·云原生·架构
智塑未来7 小时前
中小公司在线文档选型:从协作入口到安全边界
运维·安全
新时代牛马7 小时前
Linux 内核入门地图:架构、源码目录与五大子系统
linux·运维·架构
智购科技无人售货机厂家7 小时前
2026自动售货机制冷系统维护指南:从散热器清洁到压缩机换油的工程实践~YH
运维·redis·物联网·缓存·架构
剑客的茶馆7 小时前
开发者,运维怎样转行FDE?
运维·ai·开发·fde
Julien20047 小时前
控制 SELinux 文件上下文
linux·运维·服务器