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)处理复杂场景
- 注意网络安全问题,避免开放不必要的端口
发表评论