zoukankan      html  css  js  c++  java
  • python网络编程(十一)

    epoll版-TCP服务器

    1. epoll的优点:

    1. 没有最大并发连接的限制,能打开的FD(指的是文件描述符,通俗的理解就是套接字对应的数字编号)的上限远大于1024
    2. 效率提升,不是轮询的方式,不会随着FD数目的增加效率下降。只有活跃可用的FD才会调用callback函数;即epoll最大的优点就在于它只管你“活跃”的连接,而跟连接总数无关,因此在实际的网络环境中,epoll的效率就会远远高于select和poll。

    2. epoll使用参考代码

    import socket
    import select
    
    # 创建套接字
    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    
    # 设置可以重复使用绑定的信息
    s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
    
    # 绑定本机信息
    s.bind(("",7788))
    
    # 变为被动
    s.listen(10)
    
    # 创建一个epoll对象
    epoll=select.epoll()
    
    # 测试,用来打印套接字对应的文件描述符
    # print s.fileno()
    # print select.EPOLLIN|select.EPOLLET
    
    # 注册事件到epoll中
    # epoll.register(fd[, eventmask])
    # 注意,如果fd已经注册过,则会发生异常
    # 将创建的套接字添加到epoll的事件监听中
    epoll.register(s.fileno(),select.EPOLLIN|select.EPOLLET)
    
    
    connections = {}
    addresses = {}
    
    # 循环等待客户端的到来或者对方发送数据
    while True:
    
        # epoll 进行 fd 扫描的地方 -- 未指定超时时间则为阻塞等待
        epoll_list=epoll.poll()
    
        # 对事件进行判断
        for fd,events in epoll_list:
    
            # print fd
            # print events
    
            # 如果是socket创建的套接字被激活
            if fd == s.fileno():
                conn,addr=s.accept()
    
                print('有新的客户端到来%s'%str(addr))
    
                # 将 conn 和 addr 信息分别保存起来
                connections[conn.fileno()] = conn
                addresses[conn.fileno()] = addr
    
                # 向 epoll 中注册 连接 socket 的 可读 事件
                epoll.register(conn.fileno(), select.EPOLLIN | select.EPOLLET)
    
    
            elif events == select.EPOLLIN:
                # 从激活 fd 上接收
                recvData = connections[fd].recv(1024)
    
                if len(recvData)>0:
                    print('recv:%s'%recvData)
                else:
                    # 从 epoll 中移除该 连接 fd
                    epoll.unregister(fd)
    
                    # server 侧主动关闭该 连接 fd
                    connections[fd].close()
    
                    print("%s---offline---"%str(addresses[fd]))

    2. 说明

    • EPOLLIN (可读)
    • EPOLLOUT (可写)
    • EPOLLET (ET模式)

    epoll对文件描述符的操作有两种模式:LT(level trigger)和ET(edge trigger)。LT模式是默认模式,LT模式与ET模式的区别如下:

    LT模式:当epoll检测到描述符事件发生并将此事件通知应用程序,应用程序可以不立即处理该事件。下次调用epoll时,会再次响应应用程序并通知此事件。
    
    ET模式:当epoll检测到描述符事件发生并将此事件通知应用程序,应用程序必须立即处理该事件。如果不处理,下次调用epoll时,不会再次响应应用程序并通知此事件。
  • 相关阅读:
    netty入门
    zookeeper安装
    nginx
    链式调用方法的实现原理和方法
    UI设计篇·入门篇·简单动画的实现,为布局设置动画,用XML布置布局动画
    UI设计篇·入门篇·简单动画的实现,透明动画/旋转动画/移动动画/缩放动画,混合动画效果的实现,为动画设置监听事件,自定义动画的方法
    UI设计篇·入门篇·绘制简单自定义矩形图/设置按钮按下弹起颜色变化/设置图形旋转
    XML文档的生成和解析操作方法
    ListView的基本使用方法和RecyclerView的基本使用方法
    Fragment的粗浅理解
  • 原文地址:https://www.cnblogs.com/leecoffee/p/9035554.html
Copyright © 2011-2022 走看看