一、Socket基础概念
Socket(套接字)是计算机网络通信的基本端点,它提供了不同主机间进程通信的机制。Python通过内置的socket模块支持网络编程,可实现TCP和UDP两种协议的通信。
核心概念:
- 协议族(Address Family): AF_INET(IPv4)、AF_INET6(IPv6)
- 类型(Socket Type): SOCK_STREAM(TCP)、SOCK_DGRAM(UDP)
- 端口号(Port): 0-65535(0-1023为系统保留端口)
二、TCP编程实现
TCP是面向连接的可靠协议,通信过程需要三次握手建立连接。
服务器端实现
import socket
# 创建TCP套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定地址和端口
server_address = ('localhost', 12345)
server_socket.bind(server_address)
# 开始监听
server_socket.listen(5)
print("服务器正在监听端口12345...")
try:
while True:
# 等待客户端连接
client_socket, client_address = server_socket.accept()
print(f"新连接来自:{client_address}")
try:
# 接收数据
data = client_socket.recv(1024)
print(f"收到消息:{data.decode()}")
# 发送响应
response = "消息已接收".encode()
client_socket.sendall(response)
finally:
# 关闭客户端连接
client_socket.close()
finally:
# 关闭服务器套接字
server_socket.close()
客户端实现
import socket
# 创建TCP套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务器
server_address = ('localhost', 12345)
client_socket.connect(server_address)
try:
# 发送消息
message = "Hello, Server!".encode()
client_socket.sendall(message)
# 接收响应
data = client_socket.recv(1024)
print(f"收到响应:{data.decode()}")
finally:
# 关闭连接
client_socket.close()
三、UDP编程实现
UDP是无连接的不可靠协议,通信无需建立连接。
服务器端实现
import socket
# 创建UDP套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定地址和端口
server_address = ('localhost', 12345)
server_socket.bind(server_address)
print("UDP服务器启动...")
try:
while True:
# 接收数据
data, client_address = server_socket.recvfrom(1024)
print(f"收到来自{client_address}的消息:{data.decode()}")
# 发送响应
response = "UDP消息已接收".encode()
server_socket.sendto(response, client_address)
finally:
# 关闭套接字
server_socket.close()
客户端实现
import socket
# 创建UDP套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 目标地址
server_address = ('localhost', 12345)
try:
# 发送消息
message = "Hello, UDP Server!".encode()
client_socket.sendto(message, server_address)
# 接收响应
data, server = client_socket.recvfrom(1024)
print(f"收到响应:{data.decode()}")
finally:
# 关闭套接字
client_socket.close()
四、关键技术点
- 异常处理: 使用try-except块处理连接超时、中断等异常
- 多线程支持: 服务器端可使用threading模块处理并发连接
- 超时设置: 通过settimeout()方法设置操作超时时间
- 端口重用: 设置SO_REUSEADDR选项允许端口重用
- 数据序列化: 复杂数据需使用pickle或json进行序列化传输
五、应用场景
- TCP应用: Web服务器、文件传输、邮件服务
- UDP应用: 视频流传输、实时游戏、DNS查询
六、常见问题处理
- 端口被占用: 更换端口或设置SO_REUSEADDR
- 连接被拒绝: 检查服务器是否启动及防火墙设置
- 数据粘包问题: 使用长度前缀法或分隔符区分数据包
- 网络延迟: 设置合理的超时时间和重试机制
通过掌握Python的Socket编程,开发者可以构建各类网络应用,从简单的客户端/服务器模型到复杂的分布式系统。实际开发中需要根据具体需求选择合适的协议和架构,同时注意网络安全和性能优化。