HTML与HTTP服务器交互笔记
一、Text类型(HTML)处理
-
Content-Type设置
服务器通过
send_head函数为HTML文件设置Content-Type: text/html;charset=utf-8,确保中文正常显示(如01.html中的"展望2026,中国房地产政策..."等中文内容)。代码片段:
ccase FILE_HTML: http_cmd[2] = "Content-Type: text/html;charset=utf-8\r\n"; break; -
HTML文件功能
03.html:登录表单页,通过form标签提交数据到/login路径,包含用户名(username)和密码(userpass)输入框。01.html:登录成功页,包含文本、标题、列表、图片引用(1.jpg、2.png)、超链接等HTML元素。02.html:跳转页,背景色为红色,可通过01.html的"go to 2"链接访问。04.html:登录失败页,显示"密码错"提示。
二、JPEG类型处理
-
识别与响应
服务器通过判断URL后缀(
.jpg)识别JPEG文件,设置Content-Type: image/jpeg,并发送对应文件(如01.html中引用的1.jpg)。代码片段:
celse if (strlen(url) > 4 && 0 == strcmp(&url[strlen(url) - 4], ".jpg")) { send_file(conn, url + 1, FILE_JPG); // url+1去除前缀"/",直接访问文件名 } -
注意事项
- 需确保JPEG文件(如
1.jpg)与服务器程序在同一目录,否则open函数会报错。 - 服务器通过
file_size函数获取文件大小,并在响应头中设置content-length,便于客户端接收完整文件。
- 需确保JPEG文件(如
三、短对话(单次请求-响应)
-
交互流程
客户端(浏览器)与服务器的交互为"短对话"模式:
- 客户端发送HTTP请求(如
GET /login?username=zhangsan&userpass=123 HTTP/1.1)。 - 服务器解析URL,验证参数后返回对应文件(
01.html或04.html)。 - 响应完成后,服务器通过
close(conn)关闭连接(Connection: keep-closed)。
- 客户端发送HTTP请求(如
-
代码实现
主循环中
accept接收连接后,处理请求并立即关闭连接:cwhile (1) { int conn = accept(listfd, (SA)&cli, &len); // 处理请求(recv、解析URL、send_file) close(conn); // 短对话:一次请求后关闭连接 }
四、长对话(持久连接)
-
当前限制
现有代码未实现长对话,因响应头设置
Connection: keep-closed,且每次请求后主动关闭连接。 -
实现思路
若需支持长对话(同一连接处理多次请求),需修改:
- 响应头设置
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文件通过表单、超链接等元素与服务器形成交互闭环(如登录流程)。