🎯 本节目标:
1. 掌握TCP/UDP协议的核心差异
2. 学会使用`socket`模块进行网络通信
3. 从零实现HTTP服务器
4. 开发实战项目:多用户即时聊天系统
5. 理解网络安全基础原则
1️⃣ 协议基础:数字世界的交通规则
| **协议** | 核心特性 | 典型应用场景 |
|----------|-----------------------------|-----------------------|
| **TCP** | 可靠传输、三次握手、流量控制 | 网页浏览、文件传输 |
| **UDP** | 无连接、高效、不保证送达 | 视频流、实时游戏 |
📞 生活化比喻:
- **TCP** → 打电话(确认对方接听才开始交流)
- **UDP** → 寄明信片(发出后不确认是否收到)
2️⃣ Socket编程:通信端点构建
**🔌 TCP服务端四部曲**:
```python
import socket
1. 创建套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
2. 绑定地址(0.0.0.0表示允许任意IP连接)
server_socket.bind(('0.0.0.0', 8888))
3. 开始监听(最多5个等待连接)
server_socket.listen(5)
print("🕸️ 服务端已启动,等待连接...")
4. 接受连接
client_socket, addr = server_socket.accept()
print(f"✅ 客户端 {addr} 已连接")
```
📱 TCP客户端:
```python
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('127.0.0.1', 8888))
client.send(b'Hello Server!')
```
3️⃣ HTTP服务器:从零打造
```python
from http.server import BaseHTTPRequestHandler, HTTPServer
class MyHandler(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.end_headers()
self.wfile.write(b'''
<html>
<body><h1>自建服务器!</h1></body>
</html>
''')
- 启动服务器
server = HTTPServer(('localhost', 8080), MyHandler)
print("🌐 HTTP服务运行在 http://localhost:8080")
server.serve_forever()
```
4️⃣ 实战项目:即时聊天系统
- 💬 服务端代码:
```python
import threading
class ChatServer:
def __init__(self):
self.clients = []
self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server.bind(('0.0.0.0', 9999))
self.server.listen()
def broadcast(self, message, sender):
for client in self.clients:
if client != sender:
try:
client.send(message.encode())
except:
self.clients.remove(client)
def handle_client(self, client):
while True:
try:
msg = client.recv(1024).decode()
self.broadcast(msg, client)
except:
self.clients.remove(client)
client.close()
break
def run(self):
while True:
client, addr = self.server.accept()
self.clients.append(client)
thread = threading.Thread(target=self.handle_client, args=(client,))
thread.start()
- 启动服务端
ChatServer().run()
```
- 📲 客户端代码:
```python
import threading
def receive_messages(client):
while True:
try:
print(client.recv(1024).decode())
except:
client.close()
break
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('127.0.0.1', 9999))
- 接收消息线程
threading.Thread(target=receive_messages, args=(client,)).start()
- 发送消息循环
while True:
msg = input("")
client.send(msg.encode())
```
📚 知识图谱
```
- 网络编程四层模型:
┌───────────────┐
│ 应用层 │ ← HTTP/FTP
├───────────────┤
│ 传输层 │ ← TCP/UDP
├───────────────┤
│ 网络层 │ ← IP/ICMP
├───────────────┤
│ 链路层 │ ← Ethernet
└───────────────┘
- 常见端口号备忘录:
| 端口 | 服务 |
|-------|---------------|
| 80 | HTTP |
| 443 | HTTPS |
| 22 | SSH |
| 3306 | MySQL |
| 27017 | MongoDB |
```
🛠️ 课后挑战
1. 为聊天系统添加用户昵称功能
2. 实现文件传输功能(TCP协议)
3. 使用UDP协议开发简易网络时钟同步工具
💡 参考答案提示:
```python
# UDP服务端示例
udp_server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp_server.bind(('0.0.0.0', 9998))
while True:
data, addr = udp_server.recvfrom(1024)
print(f"收到来自{addr}的消息:{data.decode()}")
```
🚀 下节剧透:
《数据库交互:信息帝国的基石》
👉 你将解锁:
- SQL与NoSQL的世纪对决
- ORM魔法:用Python操作数据库
- 事务与索引的深度优化
- 实战:电商订单系统开发
📢 互动任务:
在评论区分享你设想的网络应用场景,点赞最高创意将获得《Python网络编程秘籍》实体书!