标签:cli main 事件 一个 默认 net epoll == ddr
import socket import select ‘‘‘ kernel:Linux的操作系统 epoll:创造一个特殊的内存空间,tcp服务器和操作系统共用,将套接字列表放在该内存,不再使用轮询的方式遍历列表,而采用事件通知 轮询:开发上讲遍历称为轮询 事件通知: ‘‘‘ def tcp_serve(resp_socket): resp_body = ‘hahaha‘ resp_header = ‘HTTP/1.1 200 OK\r\n‘ + ‘Content-Length:%d\r\n‘ % len(resp_body) + "\r\n" + "\r\n" resp_data = resp_header + resp_body resp_socket.send(resp_data.encode(‘utf-8‘)) def main(): web_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) web_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) web_socket.bind((‘192.168.0.106‘,8080)) web_socket.listen(128) web_socket.setblocking(False) client_socket_list = list() epl = select.epoll() # 创建epoll对象,即创造特殊的内存空间 epl.register(web_socket.fileno(), select.EPOLLIN) # 将监听套接字对应的文件描述符放入epl中,web_socket.fileno()取出其对应的文件描述符,select.EPOLLIN为触发的事件类型这个表示收到数据 fd_socket_dict = dict while True: fd_event_list = epl.poll() # 默认会阻塞,直到系统监听到有数据到来,通过事件通知方式告诉这个程序,此时才会接阻塞 # epl.poll()会返回一个元组(fd, event)即文件描述符和这个文件描述符是什么事件,例如接受数据等 for fd, event in fd_event_list: if fd == web_socket.fileno(): new_socket, client_addr = web_socket.accept() epl.register(new_socket.fileno(), select.EPOLLIN) fd_socket_dict[new_socket.fileno()] = new_socket elif event == select.EPOLLIN: recv_data = fd_socket_dict[fd].recv(1024).decode(‘utf-8‘) if recv_data: tcp_serve(fd_socket_dict[fd]) else: fd_socket_dict[fd].close() epl.unregister(fd) # 将这个文件描述符从epl注册中删除 del fd_socket_dict[fd] web_socket.close() if __name__ == ‘__main__‘: main()
标签:cli main 事件 一个 默认 net epoll == ddr
原文地址:https://www.cnblogs.com/kogmaw/p/12602516.html