python网络编程

发布于:2025-05-30 ⋅ 阅读:(19) ⋅ 点赞:(0)

1. 核心概念

  • Socket(套接字):网络通信的基础,通过 IP 地址和端口实现数据传输。

  • 协议

    • TCP:可靠、面向连接的协议(如 HTTP)。

    • UDP:快速、无连接的协议(如实时视频流)。

  • 客户端-服务器模型:服务器监听请求,客户端发起连接。


2. 基础示例:TCP 客户端/服务器

TCP 服务器
import socket

# 创建 TCP socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 12345))  # 绑定地址和端口
server_socket.listen(5)  # 开始监听,最多5个等待连接

print("服务器启动,等待连接...")
client_socket, addr = server_socket.accept()  # 接受客户端连接
print(f"客户端 {addr} 已连接")

data = client_socket.recv(1024)  # 接收数据(最多1024字节)
print(f"收到数据: {data.decode()}")

client_socket.send("消息已收到".encode())  # 发送响应
client_socket.close()
server_socket.close()
TCP 客户端
import socket

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('localhost', 12345))  # 连接服务器

client.send("Hello Server!".encode())  # 发送数据
response = client.recv(1024)  # 接收响应
print(f"服务器回复: {response.decode()}")

client.close()

3. UDP 通信示例

UDP 服务器
import socket

server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_socket.bind(('localhost', 12345))

while True:
    data, addr = server_socket.recvfrom(1024)  # 接收数据和客户端地址
    print(f"收到来自 {addr} 的消息: {data.decode()}")
    server_socket.sendto("消息已收到".encode(), addr)  # 发送响应
UDP 客户端
import socket

client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
client.sendto("Hello UDP Server!".encode(), ('localhost', 12345))

response, addr = client.recvfrom(1024)
print(f"服务器回复: {response.decode()}")
client.close()

4. 高级库和框架

  • requests:处理 HTTP 请求(如 REST API)。

    import requests
    response = requests.get("https://api.example.com/data")
    print(response.json())
  • asyncio:异步网络编程(适合高并发场景)。

    import asyncio
    
    async def handle_client(reader, writer):
        data = await reader.read(100)
        message = data.decode()
        writer.write(f"收到: {message}".encode())
        await writer.drain()
        writer.close()
    
    async def main():
        server = await asyncio.start_server(handle_client, 'localhost', 12345)
        async with server:
            await server.serve_forever()
    
    asyncio.run(main())
  • Flask/Django:构建 Web 服务。

    from flask import Flask
    app = Flask(__name__)
    
    @app.route('/')
    def home():
        return "Hello World!"
    
    if __name__ == '__main__':
        app.run(host='0.0.0.0', port=5000)

5. 常见问题与调试

  • 端口占用:确保端口未被其他程序占用(如 netstat -ano 查看端口状态)。

  • 防火墙:检查防火墙是否允许端口通信。

  • 阻塞与非阻塞:使用多线程、异步或 select 模块处理多连接。


网站公告

今日签到

点亮在社区的每一天
去签到