首页 > 代码库 > Python select示例

Python select示例

import selectimport socketimport sysimport queue# Create a TCP/IPserver = socket.socket(socket.AF_INET, socket.SOCK_STREAM)server.setblocking(0)# Bind the socket to the portserver_address = (localhost, 10000)print (sys.stderr, starting up on %s port %s % server_address)server.bind(server_address)# Listen for incoming connectionsserver.listen(5)# Sockets from which we expect to readinputs = [ server ]# Sockets to which we expect to writeoutputs = [ ]# Outgoing message queues (socket:Queue)message_queues = {}while inputs:    # Wait for at least one of the sockets to be ready for processing    print (sys.stderr, waiting for the next event)    readable, writable, exceptional = select.select(inputs, outputs, inputs)    # Handle inputs    for s in readable:        if s is server:            # A "readable" socket is ready to accept a connection            connection, client_address = s.accept()            print (sys.stderr,   connection from, client_address)            connection.setblocking(0)            inputs.append(connection)            # Give the connection a queue for data we want to send            message_queues[connection] = queue.Queue()        else:            data = s.recv(1024)            if data:                # A readable client socket has data                print (sys.stderr,   received "%s" from %s %(data, s.getpeername()))                message_queues[s].put(data)                # Add output channel for response                if s not in outputs:                    outputs.append(s)            else:                # Interpret empty result as closed connection                print (sys.stderr,   closing, client_address)                # Stop listening for input on the connection                if s in outputs:                    outputs.remove(s)                inputs.remove(s)                s.close()                # Remove message queue                del message_queues[s]    # Handle outputs    for s in writable:        try:            next_msg = message_queues[s].get_nowait()        except queue.Empty:            # No messages waiting so stop checking for writability.            print (sys.stderr,   , s.getpeername(), queue empty)            outputs.remove(s)        else:            print (sys.stderr,   sending "%s" to %s %(next_msg, s.getpeername()))            s.send(next_msg)    # Handle "exceptional conditions"    for s in exceptional:        print (sys.stderr, exception condition on, s.getpeername())        # Stop listening for input on the connection        inputs.remove(s)        if s in outputs:            outputs.remove(s)        s.close()        # Remove message queue        del message_queues[s]

 

 

import socketimport sysmessages = [This is the message. ,             It will be sent ,             in parts.,             ]server_address= (localhost, 10000)# Create aTCP/IP socketsocks = [socket.socket(socket.AF_INET, socket.SOCK_STREAM),          socket.socket(socket.AF_INET,socket.SOCK_STREAM),          ]# Connect thesocket to the port where the server is listeningprint (sys.stderr, connecting to %s port %s % server_address)for s in socks:    s.connect(server_address)for message in messages:    # Send messages on both sockets    for s in socks:        print (sys.stderr, %s: sending"%s" %(s.getsockname(), message))        s.send(bytes(message,encoding=utf-8))    # Read responses on both sockets    for s in socks:        data = s.recv(1024)        print (sys.stderr, %s: received"%s" %(s.getsockname(), data))        if not data:            print (sys.stderr, closingsocket, s.getsockname())            s.close()

 

Python select示例