Usando solo select y sockets.
    
Código Python:
Ver originalimport select
import socket
import sys
import re
 
 
CONNECTION_LIMIT = 10
HOST, PORT = 'localhost', 8080
 
# Create a TCP/IP socket
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.setblocking(0)
 
# Bind the socket to the port
server_address = (HOST, PORT)
print >>sys.stderr, 'starting up on %s port %s' % server_address
server.bind(server_address)
 
# Listen for incoming connections
server.listen(10)
 
# Sockets from which we expect to read
inputs = [ server ]
 
# Sockets to which we expect to write
outputs = [ ]
 
# User list
users = {}
 
def broadcast(sockets, message):
    for s in sockets:
        s.send(message)
 
while True:
    readable, writable, exceptional = select.select(inputs, outputs, inputs)
    
    # Handle inputs
    for s in readable:
        if s is server:
            # A "readable" server socket is ready to accept a connection
            connection, client_address = s.accept()
            connection.setblocking(0)
 
            inputs.append(connection)
            outputs.append(connection)
 
            users[connection] = "nameless"
            username = users[connection]
            broadcast(outputs, '%s has enter' % username)
        else:
            data = s.recv(1024)
            if data:
                # A readable client socket has data
                data = data.strip()
                m = re.match(r'^/nick (\w+)$', data, re.I)
                if m:
                    old_username = users[s]
                    users[s] = m.group(1)
                    data = '%s is now %s' % (old_username, users[s])
                else:
                    data = "%s > %s" % (users[s], data)
                broadcast(outputs, data)
            else:
                # Stop listening for input on the connection
                username = users[s]
                outputs.remove(s)
                inputs.remove(s)
                s.close()
                broadcast(outputs, '%s has left' % username)
        
 
    # Handle "exceptional conditions"
    for s in exceptional:
        # Stop listening for input on the connection
        inputs.remove(s)
        outputs.remove(s)
        s.close()
  
    
Código Python:
Ver original# client.py
import socket
import sys
import select
import Queue
 
HOST, PORT = 'localhost', 8080
server_address = (HOST, PORT)
 
# Create a TCP/IP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 
# Connect the socket to the port where the server is listening
print >>sys.stderr, 'connecting to %s port %s' % server_address
sock.connect(server_address)
 
 
inputs = [sys.stdin, sock]
outputs = [sock]
queue = Queue.Queue()
 
while True:
    readable, writable, exceptional = select.select(inputs, outputs, inputs)
 
    for r in readable:
        if r is sys.stdin:
            message = sys.stdin.readline()
            queue.put(message)
        elif r is sock:
            data = sock.recv(1024)
            if not data:
                sock.close()
                print "Connection closed"
                sys.exit(0)
            else:
                print data
            
    for w in writable:
        if w is sock:
            try:
                next_msg = queue.get_nowait()
                sock.send(next_msg)
            except Queue.Empty:
                pass
 
    for ex in exceptional:
        if ex is sock:
            sock.close()
  
PD: Esto no funcionara en windows. El servidor si, pero el cliente no.