Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103916
  • 博文数量: 80
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 600
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-14 09:52
文章分类

全部博文(80)

文章存档

2026年(37)

2025年(6)

2022年(2)

2017年(14)

2016年(16)

我的朋友

分类: LINUX

2026-03-31 17:02:24

Socket和epoll的简单对比介绍:

Socket是网络通信的基础接口,而epoll是Linux下高效的IO多路复用机制。它们的主要优点如下:


Socket的优点:

  1. 通用性强:几乎所有操作系统都支持Socket,是网络编程的标准接口
  2. 简单易用:提供基础的连接建立、数据收发功能,编程模型直观
  3. 协议支持广:支持TCP、UDP等多种协议
  4. 跨平台:不同系统上的Socket API基本一致

epoll的优点:

  1. 高性能:能同时处理大量连接(数万级别),适合高并发场景
  2. 高效通知:只返回活跃的连接,避免无谓的遍历检查
  3. 内存友好:不需要像select那样每次都复制整个文件描述符集合
  4. 事件驱动:采用回调机制,CPU利用率高
  5. 扩展性强:没有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()


阅读(4) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~