简介:面向计算机网络课程设计的电子图书馆网站设计资料包,内容覆盖从需求分析到配置实现的全过程。项目要求站点接入Internet,内部采用1000M主干网、100M到点,至少划分4个子网,并提供DNS、DHCP、WEB、FTP等服务,同时编写简易主页。资料包含1个DOC文档,包体仅26KB,适合正在完成同类课程设计的学生作为报告参考。文档详细给出了课程设计大纲、任务书、评分标准,并分章阐述了需求分析、硬软件选型、网络拓扑与子网划分、服务器配置以及应用软件设计,还涉及电子图书特点、常见电子读物格式对比等知识。读者可借鉴其中对1000M主干网与100M到点方案、子网规划、服务配置的表述,快速搭建自己的设计框架。目前已有947人学习下载,对需要规范完成网络课程设计报告的学生具有直接参考价值。
1. 电子图书馆网站,是计算机网络课程设计里性价比最高的题目
期末周的计算机网络课程设计,很多同学把“电子图书馆”做成了另一个套模板的网页:页面挺好看,答辩时却被问住——你的网站用到 TCP 了吗?IP 地址怎么规划的?HTTP 请求报文长什么样?这个标题的真正价值不是再造一个图书馆前端,而是把计算机网络的核心考点——应用层的 HTTP/DNS、传输层的 TCP、网络层的 IP/ARP、数据链路层的以太网——全部落进一个能演示、能抓包、能讲清楚的网站里。它适合计算机网络、网络工程、物联网等专业的课程设计,也适合想补一个“能讲清原理”的项目作品的人。下面我按带课设时常用的方案,从评分点、选型、实现到避坑完整走一遍。
2. 计算机网络课程设计评分点:把网站功能映射到网络协议栈
2.1 为什么电子图书馆网站能覆盖一个课设的全部考点
一次完整的网站访问,从浏览器地址栏输入 IP 或域名开始:如果是域名,先请求 DNS 服务器解析;接着浏览器和服务器建立 TCP 连接,完成三次握手;然后浏览器发 HTTP 请求报文,服务器回响应报文;如果是局域网里的访问,还要经过 ARP 解析把 IP 换成 MAC 地址。整个过程几乎把计算机网络教材里的重点章节全部走了一遍。
对照评分表,这正好是课设老师最看重的部分。我用一张表把考点和网站功能的映射关系整理出来,做设计报告时可以直接引用:
| 网络层次 | 考点 | 在电子图书馆网站里的体现 |
|---|---|---|
| 应用层 | HTTP 报文格式、状态码 | 浏览器向服务器请求图书列表,返回 200 或 404 |
| 应用层 | DNS 域名解析 | 访问lib.lan时先解析成 IP,或本地 hosts 模拟 |
| 传输层 | TCP 三次握手与四次挥手 | 浏览器与 Web 服务器建立/断开连接,可用抓包看到 |
| 网络层 | IP 地址与子网划分 | 服务器、客户端的静态 IP 规划,不同网段互通问题 |
| 数据链路层 | ARP、以太网帧 | 局域网内arp -a可见 IP 与 MAC 的映射 |
| 网络层 | ICMP 差错报告 | ping检查服务器是否在线 |
| 应用层 | 用户登录与 Cookie/Session | 登录态维持、会话管理 |
结论很直接:电子图书馆的业务逻辑简单,但网络知识点覆盖度高。相比做聊天室要处理 WebSocket 长连接,或者做视频网站要面对流量压力和编解码,图书检索、借阅、登录这类功能把注意力留给了网络层本身,这才是课设该有的样子。
2.2 技术栈选型:B/S 架构与 LAMP 是课设的保守答案
技术栈选择不需要“追新”。课程设计评分看的是网络原理和工程规范性,不是用了某个 2025 年的新框架。最稳的组合是 B/S 架构 + LAMP(Linux + Apache + MySQL + PHP)。这套方案有两个硬优势:一是和《计算机网络(谢希仁)》或王道系列教材里的应用层例子一致,讲 HTTP 时老师默认你用的就是这个套路;二是在学校机房里部署起来几乎没有额外依赖,Apache 和 PHP 装上就能跑,不像 Node 系还要处理包管理那堆玄学问题。
如果更熟悉 Python,用 Flask 替换 Apache/PHP 同样成立。我在实际带课设时一般这样选:新手上手用 Flask,代码量少,路由和请求处理非常直观;学校机房要求统一环境时切回 PHP,把业务逻辑写在一个index.php里也能跑通。需要注意的是,无论用哪种,都要在报告里写明“为什么选它”,这本身就是评分点。
下面是一个可对照的环境清单:
| 组件 | 推荐选型 | 作用 |
|---|---|---|
| Web 服务器 | Apache 2.4 系列 或 Flask 内置服务器 | 接收 HTTP 请求,返回页面 |
| 数据库 | MySQL 8.x 系列 | 存储用户、图书、借阅记录 |
| 后端语言 | PHP 8.x 或 Python 3.x | 处理业务逻辑、数据库操作 |
| 前端 | HTML + CSS + JavaScript | 页面结构、样式、异步请求 |
| 网络抓包 | Wireshark 或 tcpdump | 验证三次握手、查看报文结构 |
这里多说一句教材的作用。《计算机网络:自顶向下方法》把“应用层 → 传输层 → 网络层”讲得很顺,课设报告可以按这个顺序组织。王道或谢希仁的书更偏考研体系,重点是协议细节。不要等答辩前才翻书,开发过程中每写完一个页面,顺手记下它对应的协议点,后面写报告会轻松很多。
2.3 动手前先弄懂这 5 个协议细节:从三次握手到 ARP
写代码前,我在白板上先过一遍这 5 个细节,每个都对应一个后续可能踩的坑:
第一个是 TCP 三次握手。浏览器访问网站时,连接建立过程是 SYN → SYN-ACK → ACK。这里容易被问的是“第三次握手失败了会怎样”,答案是服务器端会有半连接队列,特定情况下会影响正常连接。第二个是四次挥手。断开连接时,主动方发 FIN,被动方回 ACK,然后被动方再发 FIN,主动方回 ACK,最后主动方进入 TIME_WAIT 状态。课设里最常见的追问就是“Connection: close 和 keep-alive 的区别”,前者每次请求后断开连接,后者会复用 TCP 连接。
第三个是 HTTP 请求报文结构。请求行 + 请求头 + 空行 + 请求体的格式要能默写。第四个是 DNS 解析流程。本机 hosts → 本地 DNS 缓存 → 递归查询 → 迭代查询。课设可以在 hosts 里把域名映射到本机 IP,省去搭 DNS 服务器的麻烦。第五个是 ARP。局域网里访问服务器 IP 时,数据链路层要先通过 ARP 拿到服务器网卡的 MAC 地址,arp -a能看到缓存结果。
下面这个命令组合,是我在做课设前必跑一遍的“网络体检”:
# 查看本机 IP 地址和子网掩码,确认服务器地址规划 ip addr show # 查看当前建立的 TCP 连接,确认 80/5000 端口在监听 netstat -tlnp # 查看 ARP 缓存,排查局域网内 IP 和 MAC 对应关系 arp -a # 测试与服务器的连通性,观察 ICMP 报文往返 ping -c 3 192.168.1.110参数说明:ip addr show显示的 inet 后面是 IPv4 地址和子网掩码,比如192.168.1.110/24表示网络位是前 24 位;netstat -tlnp里t表示 TCP、l表示监听状态、n用数字显示端口、p显示进程名;ping -c 3在 Linux 下表示发送 3 个 ICMP 回显请求包。如果netstat里看不到服务器进程在监听对应端口,后面局域网访问肯定失败,这是排查的第一站。
3. 把电子图书馆网站拆成可交付模块:功能清单、网络拓扑与数据库
3.1 功能模块怎么切:一个能过审的课设至少要有这些页面
课程设计不是商业项目,不需要做成全功能图书馆管理系统。但也不能只有一个静态页面。以我看到的优秀课设作品来说,功能切到“能讲清一个完整业务流程”就够了。建议至少包含四个模块:
- 用户登录与注册:对应 Session/Cookie 管理,能演示 HTTP 是无状态协议这个考点。
- 图书检索:搜索框输入关键词,后端查数据库,结果异步刷新。这是最核心的演示功能,因为能看到 HTTP 异步请求的过程。
- 图书列表与详情:从书架页点进某本书,对应一次新的 HTTP 请求,路由参数要能讲清楚。
- 借阅与归还:写入数据库并更新图书状态,牵扯事务和并发,答辩时能讲“为什么加锁”。
如果时间和精力允许,再加一个管理员后台,只是修改“可借数量”的接口,不做复杂权限系统。加这个模块的意义在于能引出“同一个 Web 服务器如何区分不同资源路径”这个问题,对应到 HTTP 报文里的请求行和 URL 路由,是老师喜欢问的点。
每个页面都要预留一个“网络观察口”。比如书架的请求,要在浏览器开发者工具里能看到完整的 HTTP 请求头、响应头和状态码,这是答辩现场最直接的证据。
3.2 网络拓扑与 IP 规划:单机演示和双机演示都该怎么配
课设的网络拓扑有两种常见形态。单机演示最简单:服务器和浏览器都在同一台电脑上,访问127.0.0.1:5000。这种方案能跑通,但老师会追问“这算什么网络实验”。我的建议是至少做双机演示——一台机器跑网站,另一台手机或电脑通过局域网访问,这才是真正意义上的“网络”课程设计。
拓扑结构很简单:一台服务器和若干客户端接入同一个交换机或同一台无线路由器,构成一个 C 类局域网。下面是我常用的一份 IP 规划表:
| 设备 | 角色 | IP 地址 | 子网掩码 | 默认网关 |
|---|---|---|---|---|
| Web 服务器 | 服务器 | 192.168.1.110 | 255.255.255.0 | 192.168.1.1 |
| 演示笔记本 | 客户端 | 192.168.1.120 | 255.255.255.0 | 192.168.1.1 |
| 手机 | 客户端 | 192.168.1.130 | 255.255.255.0 | 192.168.1.1 |
这份表不要随便抄,要对着实际环境改:路由器网段可能不是 192.168.1.x,要先看 DHCP 分配的地址段再定静态 IP。设置静态 IP 的作用有两个:一是保证演示时服务器地址不变,二是报告里能写“手工规划 IP、不依赖 DHCP,减少地址变动带来的连接问题”,这是加分项。
如果图省事,可以让所有设备都走 DHCP,不在同一网段时手动改一下再连。但课设报告里一定要有上面的拓扑和 IP 规划说明,因为这是网络设计最直接的体现。
3.3 数据库表结构设计:users、books、borrow_records 三张核心表
图书馆系统的数据表不用多,三张就够:用户表、图书表、借阅记录表。下面是建表 SQL,复制到 MySQL 里执行即可:
-- 用户表:存储登录账号信息和基本信息 CREATE TABLE users ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, password_hash VARCHAR(255) NOT NULL, real_name VARCHAR(50), role ENUM('user', 'admin') DEFAULT 'user', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 图书表:存储书目信息和可借数量 CREATE TABLE books ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, title VARCHAR(200) NOT NULL, author VARCHAR(100) NOT NULL, isbn VARCHAR(20), category VARCHAR(50), total_count INT UNSIGNED DEFAULT 1, available_count INT UNSIGNED DEFAULT 1, INDEX idx_title (title) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 借阅记录表:关联用户和图书,记录借还时间 CREATE TABLE borrow_records ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, user_id INT UNSIGNED NOT NULL, book_id INT UNSIGNED NOT NULL, borrow_time DATETIME NOT NULL, return_time DATETIME DEFAULT NULL, FOREIGN KEY (user_id) REFERENCES users(id), FOREIGN KEY (book_id) REFERENCES books(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;参数说明:INT UNSIGNED是正整数,避免负数带来无意义的 ID;ENUM('user','admin')限定角色只有两种取值;DEFAULT CURRENT_TIMESTAMP让创建时间自动生成,不需要代码里手动填。utf8mb4一定要写,否则书名里的生僻字和 emoji 会变成问号,后面避坑章节会展开。
INDEX idx_title (title)这里的索引值得多讲一句:图书检索的 SQL 是WHERE title LIKE '%关键词%',前面的通配符会让普通索引失效,但课设数据量小,实际走全表扫描也没什么问题。索引写上是为了说明设计者有索引意识,答辩时主动说“数据量大时可以考虑全文索引”,印象分会好很多。外键约束在 InnoDB 下才生效,MyISAM 不支持,这也是建表时指定 ENGINE 的原因。
4. 用 Flask 在局域网跑通电子图书馆:前后端联调与网络配置
4.1 后端查询接口:预处理 SQL 与 JSON 响应的最小实现
技术栈我以 Flask 为例,因为代码短、好讲解。后端核心是图书检索接口,它同时牵扯数据库连接和 HTTP 路由两个考点。以下是最小可运行的实现:
# app.py —— 电子图书馆后端入口 from flask import Flask, request, jsonify, session import pymysql app = Flask(__name__) app.secret_key = "course-design-secret" # 数据库连接函数,每次请求创建一个连接 def get_db(): conn = pymysql.connect( host="127.0.0.1", user="library_user", password="your_password", database="library_db", charset="utf8mb4", cursorclass=pymysql.cursors.DictCursor ) return conn # 图书检索接口:/search?q=关键字 @app.route("/search") def search(): keyword = request.args.get("q", "") if not keyword: return jsonify({"code": 400, "msg": "missing keyword"}), 400 conn = get_db() try: with conn.cursor() as cur: sql = "SELECT id, title, author, available_count FROM books WHERE title LIKE %s" # 参数化查询,避免 SQL 注入 cur.execute(sql, (f"%{keyword}%",)) rows = cur.fetchall() return jsonify({"code": 0, "data": rows}) except Exception as e: return jsonify({"code": 500, "msg": str(e)}), 500 finally: conn.close() if __name__ == "__main__": app.run(host="0.0.0.0", port=5000, debug=False)逻辑说明:/search路由接收查询参数q,在books表里做模糊匹配,结果用 JSON 返回。这里有两个细节必须讲清楚。第一,LIKE %s用了参数化查询而不是字符串拼接,这能防止' OR 1=1 --这类 SQL 注入,答辩被问到安全问题时这就是答案。第二,finally里conn.close()确保数据库连接一定会释放,不会出现连接泄漏导致服务器卡死。
参数说明:host="127.0.0.1"表示数据库就在本机,但如果 MySQL 装在另一台机器,要改成那台机器的 IP。port=5000是 Flask 默认端口,可以和 Apache 的 80 错开,避免权限问题。debug=False在演示时务必关掉,debug 模式会暴露交互式调试器,也有远程执行代码的风险。
4.2 前端页面:检索框、书架展示与登录态处理
前端不需要框架,原生 HTML + JavaScript 就够。检索页的核心是拿到用户输入、异步请求后端、渲染结果。下面这段代码实现了“输入书名关键词,点击搜索,列表刷新”的完整链路:
<!-- index.html —— 图书检索页 --> <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>电子图书馆</title> <style> .book-item { padding: 10px; border-bottom: 1px solid #eee; } .book-title { font-size: 18px; font-weight: bold; } .book-meta { color: #666; font-size: 14px; } </style> </head> <body> <h1>电子图书馆</h1> <input type="text" id="searchInput" placeholder="输入书名关键词"> <button onclick="searchBooks()">搜索</button> <div id="resultList"></div> <script> async function searchBooks() { const keyword = document.getElementById("searchInput").value; if (!keyword) { alert("请输入关键词"); return; } const resp = await fetch("/search?q=" + encodeURIComponent(keyword)); const data = await resp.json(); const list = document.getElementById("resultList"); list.innerHTML = ""; if (data.code === 0) { data.data.forEach(book => { const div = document.createElement("div"); div.className = "book-item"; div.innerHTML = ` <div class="book-title">${book.title}</div> <div class="book-meta">作者:${book.author} | 可借:${book.available_count}</div> `; list.appendChild(div); }); } else { list.innerHTML = "<p>查询失败:" + data.msg + "</p>"; } } </script> </body> </html>逻辑说明:fetch("/search?q=...")发起的是一次 HTTP GET 请求,请求路径和查询字符串由前端拼好,后端按参数名q取值。encodeURIComponent处理关键词里的中文和特殊字符,比如“计算机网络”会被编码成%E8%AE%A1%E7%AE%97%E6%9C%BA,后端收到的才是原始中文,不编码会出现中文关键词搜不到的现象。
这里有一个容易忽略的技术点:如果前端页面是从http://127.0.0.1:5000打开的,那么fetch("/search")是同源请求,不需要处理 CORS。如果强行把前端静态文件单独放到 Nginx 里并用另一个端口提供,就会出现跨域问题,浏览器控制台报错,这是“页面打开但接口失败”的常见原因,课设阶段建议让 Flask 同时服务页面和接口。
4.3 网络层配置:把网站从 localhost 变成局域网可访问
代码写完时,app.run(host="0.0.0.0")已经让服务监听了所有网卡,但很多人在这一步卡住。最典型的现象是服务器本机访问127.0.0.1:5000正常,同一 Wi-Fi 下的另一台电脑却打不开。这一步的排查顺序有固定的套路:先确认服务监听地址,再确认服务器 IP,最后看防火墙。
# 1. 确认 Flask 进程在监听 5000 端口,且地址是 0.0.0.0 ss -tlnp | grep 5000 # 2. 查看服务器当前 IP,确认与客户端在同一个网段 ip addr show | grep inet # 3. Linux 放行 5000 端口(firewalld 为例) sudo firewall-cmd --add-port=5000/tcp --permanent sudo firewall-cmd --reload # 4. 如果服务器是 Windows,用管理员 PowerShell 执行 # New-NetFirewallRule -DisplayName "Flask5000" -Direction Inbound -Protocol TCP -LocalPort 5000 -Action Allow逻辑说明:第一步看的是“服务器到底在哪个地址上等待连接”,如果监听地址是127.0.0.1,那局域网请求根本到不了进程,必须改成0.0.0.0。第二步确认服务器的局域网 IP,比如192.168.1.110,客户端访问时要输入这个地址而不是 localhost。第三步和第四步是放行防火墙入站规则,很多翻车就发生在这一步——服务明明在跑,但包被系统防火墙丢了。
客户端访问的方式也要说清楚:在另一台电脑浏览器地址栏输入http://192.168.1.110:5000/,如果换成手机访问还需要确保手机和服务器在同一个 Wi-Fi 下、并且路由器没有开启“AP 隔离”。AP 隔离会阻止同一 Wi-Fi 下的设备互相访问,这是酒店、公共 Wi-Fi 的常见配置,自己买的路由器一般在管理后台能关掉。
5. 电子图书馆网站课设避坑指南:5 个现场翻车与后悔药
5.1 翻车一:页面能打开但图片全部挂掉
现象:网站的 HTML 页面正常显示,但所有图书封面都是裂开的图标,打开浏览器控制台全是 404。原因:图片用了绝对路径引用,比如<img src="file:///C:/Users/.../cover1.jpg">或src="/static/covers/cover1.jpg",但后者要求图片确实放在 Flask 的static目录下。很多人把图片放在项目根目录的images文件夹里,路径就对不上了。解决:统一把图片放进 Flask 的static/covers/目录,HTML 里写src="{{ url_for('static', filename='covers/cover1.jpg') }}"。用url_for生成路径的好处是,不管项目部署在哪个子路径下都能正确解析。这个坑本质是对“静态资源路由”的理解不足,报告里可以顺势写一节“Web 服务器如何提供静态文件”。
5.2 翻车二:只有本机能访问,手机和演示电脑都不行
现象:服务器本机浏览器访问localhost:5000完全正常,同一局域网里的手机输入192.168.1.110:5000就是转圈或拒绝连接。原因排查后通常落在两个地方:一是 Flask 启动时host还是默认值127.0.0.1,只监听了回环地址,局域网的请求根本到不了应用层;二是 Windows 防火墙弹窗或 Linux 防火墙规则拦掉了入站端口。解决:启动参数改成host="0.0.0.0",同时确认防火墙放行 TCP 5000 端口。我曾经在一个机房环境里遇到过杀毒软件默认拦截 5000 端口的情况,换 8080 端口才解决。这类问题不要靠猜,按“监听地址 → 防火墙 → 同网段”三步走,最快 3 分钟定位。
5.3 翻车三:图书书名变成问号,中文全部乱码
现象:插入数据库的书名和作者在终端、网页里显示成“????”或“鍥句功”,用 Navicat 打开表也看到乱码。原因:数据库连接字符集和表字符集不一致。建表时如果没写CHARSET=utf8mb4,MySQL 会用默认的latin1存储中文,字节都错了,以后任何地方设置UTF-8都救不回来。解决:建库时执行CREATE DATABASE library_db DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci;,表结构也统一指定;Python 的 pymysql 连接串里写charset="utf8mb4";如果是 PHP,要在连接后执行SET NAMES utf8mb4。这套组合下来基本不会再乱码。
5.4 翻车四:演示时 Wi-Fi 断开,页面白屏
现象:演示机器连的是教室 Wi-Fi,中途网络波动,浏览器打开页面时所有样式全部丢失,表格布局变成一排文字,或者干脆白屏。原因:HTML 里通过 CDN 引入了 Bootstrap 和 jQuery,网络一断,这些外部静态资源全部加载失败。很多模板站点的做法是直接贴 CDN 链接,看起来又快又省事,但在校园网、教室 Wi-Fi 这种弱网环境里非常脆弱。解决:把所有第三方库下载到项目本地的static/vendor/目录,页面里改引本地文件。Bootstrap 的 CSS 和 JS 各自也就几百 KB,完全可接受。这不仅是演示求稳,报告里还能写一句“所有资源本地化部署,消除外部网络依赖”,是个合格工程实践点。
5.5 翻车五:答辩被问“TCP 连接什么时候断开”,答不上来
现象:演示很顺利,老师问了句“你的浏览器关掉之后,服务器和客户端的 TCP 连接是什么时候断开的?”然后场面开始沉默。原因:代码写出来了,但没有理解 HTTP 和 TCP 的关系。HTTP 是应用层协议,TCP 是传输层协议,浏览器关闭页面不等于连接立刻断开。如果响应头里有Connection: keep-alive,连接会在空闲超时后才关闭;如果是Connection: close,服务端会在响应结束后发起四次挥手。解决:答辩前用 Wireshark 抓一次完整访问的包,找到 TCP 三次握手那三条报文,再找到四次挥手那四条报文。抓包时过滤tcp.flags.fin == 1能看到 FIN 报文。这个动作只需 10 分钟,但它能让你把“参考答案”变成“我亲眼看到的结论”,说服力完全不同。
6. 答辩验收技巧:3 分钟把网站讲成一份网络课程设计
演示时间通常很短,讲页面多好看没用,要讲网络设计。我建议按下面这个节奏安排 3 分钟:
| 时间 | 动作 | 讲解要点 |
|---|---|---|
| 前 30 秒 | 打开拓扑图和 IP 规划表 | “服务器 192.168.1.110,客户端 192.168.1.120,同一网段,手工规划静态 IP” |
| 第 30~90 秒 | 现场搜索一本书并展示 Network 面板 | “这次请求发出了 HTTP GET 请求,状态码 200,响应时间 xx ms,请求头里带了 Host、User-Agent” |
| 第 90~150 秒 | 用 Wireshark 或抓包结果展示三次握手 | “这三条报文是 SYN、SYN-ACK、ACK,TCP 连接建立完成” |
| 最后 30 秒 | 点开数据库代码 | “查询用了参数化 SQL,避免注入;连接在 finally 中关闭,防止连接泄漏” |
这套演示顺序的逻辑是从宏观到微观:先讲网络拓扑(网络层),再讲一次完整的 HTTP 请求(应用层 + 传输层),最后落到代码细节(工程规范)。每个环节刚好对应一个评分维度,老师想追问也只会在这几个方向里选。
如果时间充裕,我还会多说一句 ARP。在命令行里敲arp -a,能看到服务器 IP 对应的 MAC 地址是路由器的端口还是服务器自己的网卡。这个细节属于“超出课件范围但完全相关”的知识点,讲对了很加分。
前几年我吃过只套模板的亏,页面做了几十张,答辩时讲到网络原理一句完整的话都说不出来。后来养成了一个习惯:每写完一个页面功能,先问自己“这次交互用到了哪些层的协议”,答不上来就回去翻书,答上来就把它写进报告。这个习惯比任何模板都实用——这次图书馆、下次聊天室,都能快速讲清原理。希望帮到你。
本文还有配套的精品资源,点击获取