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 小时前
C盘容量不够,python , pip,安装包的位置
linux·python·pip
二十雨辰4 小时前
[python]-循环语句
服务器·python
li_wen015 小时前
文件系统(八):Linux JFFS2文件系统工作原理、优势与局限
大数据·linux·数据库·文件系统·jffs2
wypywyp5 小时前
2.虚拟机一直显示黑屏,无法打开,可能是分配的硬盘空间不够
linux·运维·服务器
SongYuLong的博客5 小时前
TL-WR710N-V2.1 硬改刷机OpenWRT源码编译固件
linux·物联网·网络协议
m0_737302585 小时前
碳足迹精准计量,华为FusionSolar助力云服务器绿色运维
服务器
AlfredZhao5 小时前
Docker 快速入门:手把手教你打包 Python 应用
linux·docker·podman
HIT_Weston6 小时前
107、【Ubuntu】【Hugo】搭建私人博客:模糊搜索 Fuse.js(三)
linux·javascript·ubuntu
Fᴏʀ ʏ꯭ᴏ꯭ᴜ꯭.7 小时前
Haproxy会话保持:基于Cookie优化
运维·负载均衡
艾莉丝努力练剑7 小时前
【优选算法必刷100题】第007~008题(双指针算法):三数之和、四数之和问题求解
linux·算法·双指针·优选算法