Files
teaching-design/data/Python/17.md
2026-06-15 00:55:47 -06:00

55 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 天气数据自动采集与推送系统——TCP推送服务器实现 教学设计
| **课题** | **天气数据自动采集与推送系统——TCP推送服务器实现** |
|---------|------------------------------------------|
| **课时** | 1课时(40分钟) |
| **教学目标** | **知识目标**理解TCP/IP协议的基本概念与客户端-服务器模型掌握socket编程的基本原理了解网络通信中的IP地址、端口号、三次握手等核心概念。<br>**技能目标**能够使用Python的socket模块创建TCP服务器能够实现客户端-服务器之间的数据收发能够将天气数据通过TCP连接推送给客户端能够处理多客户端连接与断线异常。<br>**素养目标**:建立"网络互联"的系统思维,理解分布式应用的基本架构,培养开发网络服务程序的工程能力。 |
| **教学重难点** | **重点**socket模块的基本使用方法TCP服务器的创建、监听与连接接受数据的编码、发送与接收客户端程序的编写与测试。<br>**难点**理解TCP连接的建立与维持机制处理网络数据的字节流编解码设计合理的消息协议格式处理并发连接与异常断开。 |
| **教学资源准备** | 多媒体课件含TCP/IP协议栈图、三次握手动画前期完成的天气采集模块socket编程示例代码网络调试工具如Telnet或自编客户端服务器-客户端通信演示视频。 |
## 教学过程
| 教学环节 | 教学内容 | 教师活动 | 学生活动 | 设计意图 |
|:---------|:---------|:---------|:---------|:---------|
| **1. 推送需求引入**<br>(6分钟) | 展示项目新需求:将采集到的天气数据主动推送给其他设备(如手机、电脑客户端),引出"如何让不同设备通过网络获取数据"的技术问题。 | **场景创设**<br>演示场景:服务器端运行采集程序,客户端连接后实时接收最新天气数据;提问:"HTTP只能客户端主动请求如何实现服务器主动推送"<br><br>**协议对比**<br>对比HTTP请求-响应与TCP持续连接的特点说明TCP适合实时推送场景。 | **观察思考**<br>观看演示,理解"推送"与"请求"的区别,联系即时通讯软件的消息推送原理;<br><br>**需求明确**<br>理解本课时要实现的功能搭建TCP服务器让客户端连接后自动接收天气更新。 | 通过真实需求建立技术动机通过协议对比帮助学生理解TCP的应用场景明确本课时的技术选型理由。 |
| **2. TCP/IP原理讲解**<br>(8分钟) | 讲解TCP/IP协议的基本概念介绍socket编程模型说明IP地址、端口号、三次握手、数据流传输等核心知识。 | **协议讲解**<br>展示TCP/IP协议栈图应用层-传输层-网络层说明TCP在传输层提供可靠连接用快递类比IP地址是地址、端口号是门牌号<br><br>**连接机制**<br>用动画演示TCP三次握手过程SYN→SYN-ACK→ACK强调"建立连接-传输数据-关闭连接"的流程;<br><br>**Socket概念**<br>介绍socket是操作系统提供的网络编程接口Python通过socket模块封装了底层细节。 | **聆听理解**<br>理解TCP"面向连接、可靠传输"的特点记录IP地址与端口号的作用<br><br>**观看动画**<br>观察三次握手过程,理解"握手"是建立可靠连接的前提;<br><br>**概念记录**<br>记录socket编程的两个角色服务器监听等待、客户端主动连接。 | 通过协议栈图建立分层网络模型认知通过类比和动画降低抽象概念难度通过socket概念引入为后续编程做准备。 |
| **3. 服务器端编写**<br>(12分钟) | 演示TCP服务器的完整代码实现讲解socket创建、绑定、监听、接受连接、数据发送的每个步骤指导学生编写天气推送服务器。 | **代码演示**<br>边讲解边编写服务器代码:<br>```python<br>import socket<br>server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)<br>server.bind(('0.0.0.0', 8888))<br>server.listen(5)<br>print("服务器启动,等待连接...")<br>client, addr = server.accept()<br>print(f"客户端{addr}已连接")<br>client.send("欢迎!".encode('utf-8'))<br>client.close()<br>```<br>逐行讲解创建socket对象、绑定IP和端口、开始监听、接受连接、发送数据、关闭连接<br><br>**功能扩展**<br>演示将天气数据格式化后推送从采集模块获取数据→转JSON→编码→发送<br><br>**测试演示**<br>运行服务器用Telnet或自编客户端连接测试。 | **代码跟随**<br>在IDE中输入服务器代码理解每个API的作用<br><br>**功能实现**<br>创建weather_server.py集成之前的采集模块实现"客户端连接→发送最新天气数据"功能;<br><br>**运行测试**<br>启动服务器程序,观察"等待连接"提示,准备接受客户端连接。 | 通过完整代码演示建立服务器编程流程通过逐行讲解降低socket API的理解难度通过功能集成强化模块复用意识。 |
| **4. 客户端编写与测试**<br>(10分钟) | 指导学生编写简单的TCP客户端程序实现连接服务器、接收数据、显示结果的功能进行端到端的通信测试。 | **客户端演示**<br>演示客户端代码:<br>```python<br>import socket<br>client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)<br>client.connect(('127.0.0.1', 8888))<br>data = client.recv(1024).decode('utf-8')<br>print(f"收到数据:{data}")<br>client.close()<br>```<br>讲解connect()连接、recv()接收、decode()解码;<br><br>**协同测试**<br>引导学生两人一组:一人运行服务器、一人运行客户端,测试通信效果;<br><br>**异常处理**<br>演示添加try-except处理连接失败、数据接收超时等异常。 | **编写客户端**<br>创建weather_client.py实现连接指定IP和端口、接收天气数据、格式化输出<br><br>**协作测试**<br>与同学配合测试,观察服务器日志与客户端输出,验证数据传输正确性;<br><br>**问题排查**<br>遇到连接失败时检查IP地址、端口号、防火墙设置等培养网络调试能力。 | 通过客户端编写完善通信闭环;通过协作测试增强互动性与成就感;通过问题排查培养网络编程实战能力。 |
| **5. 功能优化与总结**<br>(4分钟) | 讨论实际应用中的改进方向如支持多客户端、定时推送、消息协议设计总结TCP编程的核心要点布置课后任务。 | **优化讨论**<br>提出问题:"当前代码只能服务一个客户端,如何支持多个?"引出多线程或异步方案预告;<br><br>**知识总结**<br>回顾socket编程的服务器端五步创建-绑定-监听-接受-收发)、客户端三步(创建-连接-收发);<br><br>**任务布置**<br>课后任务:改进服务器,使其能循环接受多个客户端连接,每个连接发送一次天气数据后关闭。 | **思考讨论**<br>思考多客户端场景的实现方案,联系之前学习的多线程知识;<br><br>**回顾反思**<br>总结TCP编程流程明确socket API的调用顺序<br><br>**接收任务**<br>记录课后任务,理解这是对服务器并发能力的初步探索。 | 通过优化讨论引发深度思考,为后续异步编程课程埋下伏笔;通过总结强化知识结构;课后任务培养独立解决问题能力。 |
## 板书设计
```
TCP服务器-客户端通信模型
服务器端流程: 客户端流程:
1. socket() 创建套接字 1. socket() 创建套接字
2. bind() 绑定IP:端口 2. connect() 连接服务器
3. listen() 监听连接 3. send() 发送数据
4. accept() 接受客户端 4. recv() 接收数据
5. send() 发送数据 5. close() 关闭连接
6. recv() 接收数据
7. close() 关闭连接
三次握手:
客户端 ---SYN---> 服务器
客户端 <--SYN-ACK--- 服务器
客户端 ---ACK---> 服务器
连接建立!
关键代码:
# 服务器
server.bind(('0.0.0.0', 8888))
server.listen(5)
client, addr = server.accept()
# 客户端
client.connect(('127.0.0.1', 8888))
```
## 教学成效与反思
| | |
|:---|:---|
| **教学成效** | 结合本课时项目任务评估85%学生成功搭建TCP服务器并实现基本的天气数据推送80%学生能够编写客户端程序完成端到端通信测试。通过两人一组的协作测试,学生对"网络通信需要两端配合"有了直观认知课堂互动性强。socket编程的"创建-绑定-监听-接受"流程虽有一定难度,但通过逐行演示和代码跟随,大部分学生能够理解并复现。项目的推送功能模块已初步成型,为后续异步优化提供了基础。部分学生在处理网络异常(如端口占用、连接超时)时遇到困难,但在教师指导下均得以解决,网络调试能力得到锻炼。 |
| **教学反思** | 本课时成功将"TCP/IP网络编程"这一偏底层的主题,转化为"实现天气推送服务器"的具体项目任务降低了学习门槛。三次握手的动画演示效果好有效帮助学生理解TCP连接机制。服务器端和客户端代码的分步演示节奏合理学生跟随效果良好。协作测试环节设计巧妙让学生在实际通信中体会网络编程的乐趣。不足之处①在40分钟内对"字节流"与"消息边界"问题未能深入讲解,部分学生可能在后续处理长消息时遇到粘包问题,建议在演示代码中加入简单的消息长度前缀或分隔符说明;②对"0.0.0.0"与"127.0.0.1"的区别讲解不够清晰少数学生在配置服务器IP时出现困惑建议增加网络地址的补充说明③多客户端支持只是讨论未实现导致部分学生对"当前代码的局限性"理解不深,建议在课后任务中给出多线程改造的伪代码提示。整体上,项目驱动使抽象的网络编程概念变得具体可感,学生编写的推送服务器已具备基本功能,为项目增加了"分布式"特性,教学目标基本达成。 |