Servidor TCP Multi-hilo



Versión: 2.x, 3.x.
Descargas: multithreaded_server.zip.

Servidor TCP multihilo o multithreaded para lograr la conexión simultánea de varios clientes. El código hace uso de los módulos estándar threading y socket, escucha peticiones en el puerto 6030 y, ante la llegada de datos, responde con la misma información (Echo server).

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#      tcpserver.py
#
#      Copyright 2014 Recursos Python - www.recursospython.com
#
#

from socket import socket, error
from threading import Thread


class Client(Thread):
    """
    Servidor eco - reenvía todo lo recibido.
    """
    
    def __init__(self, conn, addr):
        # Inicializar clase padre.
        Thread.__init__(self)
        
        self.conn = conn
        self.addr = addr
    
    def run(self):
        while True:
            try:
                # Recibir datos del cliente.
                input_data = self.conn.recv(1024)
            except error:
                print("[%s] Error de lectura." % self.name)
                break
            else:
                # Reenviar la información recibida.
                if input_data:
                    self.conn.send(input_data)


def main():
    s = socket()
    
    # Escuchar peticiones en el puerto 6030.
    s.bind(("localhost", 6030))
    s.listen(0)
    
    while True:
        conn, addr = s.accept()
        c = Client(conn, addr)
        c.start()
        print("%s:%d se ha conectado." % addr)


if __name__ == "__main__":
    main()

Puede utilizarse el siguiente cliente que conecta al servidor y permite demostrar la eficacia del código.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#      client.py
#
#      Copyright 2014 Recursos Python - www.recursospython.com
#
#

from socket import socket


# Compatibilidad con Python 3
try:
    raw_input
except NameError:
    raw_input = input


def main():
    s = socket()
    s.connect(("localhost", 6030))
    
    while True:
        output_data = raw_input("> ")
        
        if output_data:
            # Enviar entrada. Comptabilidad con Python 3.
            try:
                s.send(output_data)
            except TypeError:
                s.send(bytes(output_data, "utf-8"))
            
            # Recibir respuesta.
            input_data = s.recv(1024)
            if input_data:
                # En Python 3 recv() retorna los datos leídos
                # como un vector de bytes. Convertir a una cadena
                # en caso de ser necesario.
                print(input_data.decode("utf-8") if
                      isinstance(input_data, bytes) else input_data)


if __name__ == "__main__":
    main()



1 comentario.

Deja un comentario