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()
Curso online 👨💻
¡Ya lanzamos el curso oficial de Recursos Python en Udemy!
Un curso moderno para aprender Python desde cero con programación orientada a objetos, SQL y tkinter
en 2024.
Consultoría 💡
Ofrecemos servicios profesionales de desarrollo y capacitación en Python a personas y empresas. Consultanos por tu proyecto.
Jose says:
Muy buen ejemplo. me sirvió de maravilla.