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.