本文实例讲述了Python基于select实现的socket服务器。分享给大家供大家参考,具体如下:
借鉴了asyncore模块中select.select的使用方法
import socket import traceback import select EOL1 = b\'\\n\\n\' EOL2 = b\'\\n\\r\\n\' socketmap = {} r,w,e = [],[],[] response = b\'HTTP/1.0 200 OK\\r\\nDate: Mon, 1 Jan 1996 01:01:01 GMT\\r\\n\' response += b\'Content-Type: text/plain\\r\\nContent-Length: 13\\r\\n\\r\\n\' response += b\'Hello, world!\' serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) serversocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) serversocket.bind((\'0.0.0.0\', 23456)) serversocket.listen(1) #serversocket.setblocking(0) listening_fileno = serversocket.fileno() socketmap[listening_fileno] = serversocket print \'listening_fileno\',listening_fileno try: while True: r,w,e = [],[],[] for fd in socketmap: r.append(fd) w.append(fd) e.append(fd) r,w,e = select.select(r,w,e,1) for fd in r: request = b\'\' isocket = socketmap[fd] if fd == listening_fileno: print \'accepting\' clientsock,clientaddr = isocket.accept() #clientsock.setblocking(0) cli_fileno = clientsock.fileno() r.append(cli_fileno) w.append(cli_fileno) e.append(cli_fileno) socketmap[cli_fileno] = clientsock else: print \'reading\' while EOL1 not in request and EOL2 not in request: request += isocket.recv(1024) print(request.decode()) for fd in w: print \'writing\' osocket = socketmap[fd] osocket.send(response) for fd in e: esocket = socketmap[fd] print \'socket close\',fd esocket.close() del socketmap[fd] print \"no data coming\" except Exception,e: print traceback.print_exc() serversocket.close()
更多关于Python相关内容感兴趣的读者可查看本站专题:《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》
希望本文所述对大家Python程序设计有所帮助。
下一篇:Python数组定义方法