select 实现的 socket服务器

来源:互联网 发布:可以刷ubuntu的手机 编辑:程序博客网 时间:2024/05/16 19:23
借鉴了asyncore模块中select.select的使用方法


import socketimport tracebackimport selectEOL1 = 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] = serversocketprint 'listening_fileno',listening_filenotry:    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()



本文章来至源码世界  http://www.ymsky.net/views/65548.shtml 

0 0
原创粉丝点击