Python第十二课:网络编程 | 连接世界的数字桥梁

发布于:2025-03-04 ⋅ 阅读:(16) ⋅ 点赞:(0)

 🎯 本节目标: 

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网络编程秘籍》实体书!