<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">import socket
import sys
import re
import time
from threading import Thread

class Servidor(Thread):
    def __init__(self, puerto):
        Thread.__init__(self)
        self.salir = False
        self.server = None
        self.puerto = puerto
        self.clientes = []

    def run(self):
        self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.server.settimeout(2)
        self.server.bind(("", self.puerto))
        self.server.listen(1)

        print "Esperando clientes..."
   
        # bucle para atender clientes
        while not self.salir:
            try:
                # Se espera a un cliente
                socket_cliente, datos_cliente = self.server.accept()
                print "conectado "+str(datos_cliente)
      
                # Se crea la clase con el hilo y se arranca.
                hilo = Cliente(socket_cliente, datos_cliente, self)
                hilo.start()
                self.clientes.append(hilo)
                hilo.enviar_comando("wellcome!")
            except:
                pass

    def finalizar(self):
        if not self.salir:
            self.salir = True
            self.server.close()
            print "Cerrando servidor y desconectando clientes"
            for cliente in self.clientes:
                cliente.finalizar()
                cliente.join()
        print "Servidor y clientes finalizados"

    def broadcast(self, comando):
	if re.match("^set \d+ \d+ $", comando):
            if not self.salir:
                for cliente in self.clientes:
                    cliente.enviar_comando(comando)
        else:
            print "Problema de rebotes o comando invalido: "+str(comando)
            

#cliente para escribir por pantalla
class Cliente(Thread):
    def __init__(self, socket_cliente, datos_cliente, servidor):
        Thread.__init__(self)
        self.socket = socket_cliente
        self.datos = datos_cliente
        self.servidor = servidor
        self.salir = False

    def enviar_comando(self, comando):
        if not self.salir:
            try:
                self.socket.send(comando+"\n")
            except:
                pass

    # Bucle para atender al cliente.       
    def run(self):
        # Bucle indefinido hasta que el cliente envie "adios"
        while not self.salir:
            # Espera por datos
            peticion = self.socket.recv(9)
             
            # Contestacion y cierre a "adios"
            if (peticion.startswith("set")):
                print str(self.datos)+ " recibido comando: "+peticion
                self.servidor.broadcast(peticion)
            # Contestacion y cierre a "adios"
            elif (peticion.startswith("bye")):
                self.finalizar()

    def finalizar(self):
        if not self.salir:
            print str(self.datos)+ " recibido 'bye' contesto 'nosvemos' y desconecto"
            self.socket.send("nosvemos")
            self.socket.close()
            print str(self.datos)+ " desconectado"
            self.salir = True

if __name__ == '__main__':
    try:
        if len(sys.argv) != 2:
            raise Error()
        puerto = int(sys.argv[1])
    except:
        print "Se espera 1 argumento: python servidor.py &lt;puerto-servidor&gt;"
        sys.exit(1)

    # Se prepara el servidor
    servidor = Servidor(puerto)
    servidor.start()
    try:
        # Se espera a que se presione Ctrl+c para salir
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        print "Ctrl+c recibido! Matando a todos los hilos..."
        servidor.finalizar()
        servidor.join()
</pre></body></html>