Socket和epoll的简单对比介绍:
Socket是网络通信的基础接口,而epoll是Linux下高效的IO多路复用机制。它们的主要优点如下:
Socket的优点:
-
通用性强:几乎所有操作系统都支持Socket,是网络编程的标准接口
-
简单易用:提供基础的连接建立、数据收发功能,编程模型直观
-
协议支持广:支持TCP、UDP等多种协议
-
跨平台:不同系统上的Socket API基本一致
epoll的优点:
-
高性能:能同时处理大量连接(数万级别),适合高并发场景
-
高效通知:只返回活跃的连接,避免无谓的遍历检查
-
内存友好:不需要像select那样每次都复制整个文件描述符集合
-
事件驱动:采用回调机制,CPU利用率高
-
扩展性强:没有select的1024连接数限制
简单来说,Socket是网络通信的基础工具,而epoll是让这个工具在Linux上能高效处理海量连接的"加速器"。
# 基础Socket服务器示例
import socket
def basic_socket_server():
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 8888))
server_socket.listen(5)
print("Socket服务器启动,等待连接...")
while True:
client_socket, addr = server_socket.accept()
print(f"接收到来自 {addr} 的连接")
client_socket.send(b"Hello from basic socket server!")
client_socket.close()
if __name__ == "__main__":
basic_socket_server()
# epoll高并发服务器示例
import socket
import select
def epoll_server():
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind(('localhost', 8889))
server_socket.listen(5)
server_socket.setblocking(False)
epoll = select.epoll()
epoll.register(server_socket.fileno(), select.EPOLLIN)
connections = {}
print("epoll服务器启动,等待连接...")
try:
while True:
events = epoll.poll(1)
for fileno, event in events:
if fileno == server_socket.fileno():
client_socket, addr = server_socket.accept()
client_socket.setblocking(False)
fd = client_socket.fileno()
epoll.register(fd, select.EPOLLIN)
connections[fd] = client_socket
print(f"接收到来自 {addr} 的连接")
elif event & select.EPOLLIN:
client_socket = connections[fileno]
data = client_socket.recv(1024)
if data:
client_socket.send(b"Hello from epoll server!")
else:
epoll.unregister(fileno)
client_socket.close()
del connections[fileno]
finally:
epoll.unregister(server_socket.fileno())
epoll.close()
server_socket.close()
if __name__ == "__main__":
epoll_server()