# 天气数据自动采集与推送系统——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时出现困惑，建议增加网络地址的补充说明；③多客户端支持只是讨论未实现，导致部分学生对"当前代码的局限性"理解不深，建议在课后任务中给出多线程改造的伪代码提示。整体上，项目驱动使抽象的网络编程概念变得具体可感，学生编写的推送服务器已具备基本功能，为项目增加了"分布式"特性，教学目标基本达成。 |