Socket编程基础
Socket(套接字)是计算机网络中进程间通信的一种基本技术,它允许不同主机或同一主机上的不同进程之间进行数据交换。Python通过内置的socket模块提供了对Socket编程的支持。
Socket的核心概念:
- TCP vs UDP - 面向连接的可靠传输 vs 无连接的快速传输
- IP地址和端口号 - 网络设备的唯一标识和应用程序的通信端点
- 客户端/服务器模型 - 网络通信的基本架构模式
- 阻塞与非阻塞 - 控制Socket操作的行为模式
TCP Socket编程
TCP提供可靠的、面向连接的通信服务。下面是TCP服务器和客户端的基本实现:
TCP服务器端代码
import socket
# 创建TCP socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定地址和端口
server_address = ('localhost', 12345)
server_socket.bind(server_address)
# 监听连接
server_socket.listen(5)
print("服务器启动,等待客户端连接...")
while True:
# 接受客户端连接
client_socket, client_address = server_socket.accept()
print(f"客户端 {client_address} 已连接")
try:
# 接收数据
data = client_socket.recv(1024)
print(f"收到数据: {data.decode('utf-8')}")
# 发送响应
response = "消息已收到!"
client_socket.sendall(response.encode('utf-8'))
finally:
# 关闭连接
client_socket.close()
TCP客户端代码
import socket
# 创建TCP socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务器
server_address = ('localhost', 12345)
client_socket.connect(server_address)
try:
# 发送数据
message = "你好,服务器!"
client_socket.sendall(message.encode('utf-8'))
# 接收响应
data = client_socket.recv(1024)
print(f"收到响应: {data.decode('utf-8')}")
finally:
# 关闭连接
client_socket.close()
UDP Socket编程
UDP提供无连接的通信服务,适用于对传输速度要求高但对可靠性要求不高的场景。
UDP服务器端代码
import socket
# 创建UDP socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定地址和端口
server_address = ('localhost', 12345)
server_socket.bind(server_address)
print("UDP服务器启动,等待消息...")
while True:
# 接收数据
data, client_address = server_socket.recvfrom(1024)
print(f"收到来自 {client_address} 的消息: {data.decode('utf-8')}")
# 发送响应
response = "消息已收到!"
server_socket.sendto(response.encode('utf-8'), client_address)
UDP客户端代码
import socket
# 创建UDP socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 服务器地址
server_address = ('localhost', 12345)
# 发送数据
message = "你好,UDP服务器!"
client_socket.sendto(message.encode('utf-8'), server_address)
# 接收响应
data, server = client_socket.recvfrom(1024)
print(f"收到响应: {data.decode('utf-8')}")
# 关闭socket
client_socket.close()
高级Socket编程技巧
多线程服务器
为每个客户端连接创建独立的线程,实现并发处理:
import threading
def handle_client(client_socket):
# 处理客户端请求
pass
while True:
client, addr = server_socket.accept()
client_thread = threading.Thread(
target=handle_client,
args=(client,)
)
client_thread.start()
非阻塞Socket
使用setblocking(0)实现非阻塞操作:
server_socket.setblocking(0)
try:
client_socket, addr = server_socket.accept()
except socket.error as e:
# 处理无连接的情况
pass
Socket编程最佳实践
- 始终在finally块中关闭socket连接
- 使用try-except处理网络异常
- 为数据传输设置合理超时
- 使用大缓冲区处理数据分片问题
- 考虑使用更高级的框架(如Twisted、asyncio)处理复杂场景
- 注意网络安全问题,避免开放不必要的端口
发表评论