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文件通过表单、超链接等元素与服务器形成交互闭环(如登录流程)。
相关推荐
kebidaixu1 小时前
BCU 平台 RS485 驱动适配:从 THVD1406 到 ISO3082
linux
杨浦老苏1 小时前
家庭实验室监控仪表盘HomeLab-Monitor
运维·docker·监控·群晖
回忆2012初秋2 小时前
【Nginx】原理、配置与运维实战(2)
运维·nginx·策略模式
Urbano3 小时前
工装外套全制作流程、工序痛点及自动化设备升级方案
运维·自动化
映翰通朱工3 小时前
工业4G网关无公网IP远程运维实战(内网终端异地访问方案)
运维·服务器·网络·安全·智能路由器
洪晓露3 小时前
将 rke2 集群证书延长至 10 年
运维·服务器·数据库
谢平康4 小时前
解决用 rm 报bash: /usr/bin/rm: Argument list too long错
linux·运维·运维开发
IP老炮不瞎唠4 小时前
Python 价格监控如何实现?思路与实用方法分享
运维·服务器·网络
GIS数据转换器4 小时前
城市排水生命线安全运行监测平台深度解析
java·运维·人工智能·python·安全·数据挖掘·无人机
睡不醒男孩0308234 小时前
CLup 6.x 版本中针对StarRocks 存算一体集群的完整操作手册
java·服务器·网络·clup