Python3 网络编程:socket 套接字编程
学习Python3 网络编程,从基础 socket 编程开始,逐步深入解析 Python3 网络编程的所有内容。
1. socket 套接字编程
1.1 socket 基础
Python 提供 socket 模块来进行底层网络编程,支持 TCP(流式协议) 和 UDP(数据报协议)。
1.1.1 socket 相关概念
- IP 地址:用于标识网络中的设备(如
192.168.1.1)。 - 端口号:用于区分同一设备上的不同应用程序(如 HTTP 端口
80)。 - 协议:
- TCP(传输控制协议):面向连接,保证数据可靠传输。
- UDP(用户数据报协议):无连接,速度快,但不保证数据完整性。
- 服务器与客户端:
- 服务器(Server):监听端口,等待客户端连接。
- 客户端(Client):向服务器发起连接并传输数据。
1.2 socket TCP 编程
1.2.1 TCP 服务器
一个基本的 TCP 服务器:
import socket
# 创建 TCP 套接字(默认 SOCK_STREAM 为 TCP)
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定 IP 和端口
server_socket.bind(("0.0.0.0", 12345))
# 开始监听(最多 5 个客户端等待)
server_socket.listen(5)
print("服务器启动,等待连接...")
while True:
# 等待客户端连接
client_socket, addr = server_socket.accept()
print(f"客户端 {addr} 连接成功")
# 接收数据(最大 1024 字节)
data = client_socket.recv(1024)
print(f"收到数据:{data.decode()}")
# 发送响应
client_socket.send(b"Hello from server!")
# 关闭连接
client_socket.close()
1.2.2 TCP 客户端
客户端连接服务器并发送数据:
import socket
# 创建 TCP 套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务器
client_socket.connect(("127.0.0.1", 12345))
# 发送数据
client_socket.send(b"Hello Server!")
# 接收数据
response = client_socket.recv(1024)
print(f"服务器响应:{response.decode()}")
# 关闭连接
client_socket.close()
1.2.3 TCP 服务器 – 多线程支持
多个客户端并发连接:
import socket
import threading
def handle_client(client_socket, addr):
print(f"客户端 {addr} 连接成功")
data = client_socket.recv(1024)
print(f"收到数据:{data.decode()}")
client_socket.send(b"Hello from server!")
client_socket.close()
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(("0.0.0.0", 12345))
server_socket.listen(5)
print("服务器启动,等待连接...")
while True:
client_socket, addr = server_socket.accept()
thread = threading.Thread(target=handle_client, args=(client_socket, addr))
thread.start()
1.3 socket UDP 编程
UDP 是无连接的,适用于对速度要求高,但不要求数据可靠性的场景,如视频流或游戏。
1.3.1 UDP 服务器
import socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_socket.bind(("0.0.0.0", 12345))
print("UDP 服务器启动,等待数据...")
while True:
data, addr = server_socket.recvfrom(1024)
print(f"收到来自 {addr} 的数据:{data.decode()}")
server_socket.sendto(b"Hello from UDP Server!", addr)
1.3.2 UDP 客户端
import socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 发送数据
client_socket.sendto(b"Hello UDP Server!", ("127.0.0.1", 12345))
# 接收服务器响应
data, server = client_socket.recvfrom(1024)
print(f"服务器响应:{data.decode()}")
client_socket.close()
1.4 套接字选项
使用 setsockopt 设置不同的套接字行为:
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置 SO_REUSEADDR 允许端口复用,避免“地址已在使用”错误
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 绑定端口
sock.bind(("0.0.0.0", 12345))
sock.listen(5)
下篇文章继续讲解 asyncio 异步网络编程,包括 asyncio TCP 服务器、asyncio WebSocket 服务器等内容!