Sistemas Distribuidos: Servidor sencillo en Python


En una de las prácticas de la asignatura de Sistemas Distribuidos, y para que tengan varias opciones a la hora de programar un pequeño programa que les pedimos y que debe seguir la arquitectura cliente-servidor, les dejaré el esqueleto en python y C de ambos procesos.

En muchos sitios, he encontrado un código similar a éste (para el servidor):

#!/usr/bin/python
#encoding:utf-8
try:
 import socket,sys,optparse
except:
 print("Error running 'import socket,sys,optparse'. Maybe you have to install some python library")
parser = optparse.OptionParser("usage%prog " + "-d <ip> -p <target port>")
parser.add_option('-d', dest = 'ip', type = 'string', help = 'Please, specify the target server')
parser.add_option('-p', dest = 'port', type = 'string', help = 'Please, specify the target port')
(options, args) = parser.parse_args()
if (options.ip == None):
 print '[-] You must specify a ip direction to listen to.'
 exit(0)
if (options.port == None):
 print '[-] You must specify a port.'
 exit(0)
HOST=options.ip
PORT=int(options.port)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print 'Socket created'
try:
 s.bind((HOST, PORT))
except socket.error , msg:
 print 'Bind failed. Error code: ' + str(msg[0]) + 'Error message: ' + msg[1]
 sys.exit()
print 'Socket bind complete'
s.listen(1)
print 'Socket now listening'
conn, addr = s.accept()
print 'Connected with ' + addr[0] + ':' + str(addr[1])
while True:
 #receive data
 data = conn.recv(1024)
 #process data
 if not data:
 break
 #elif re.match(data, "QUIT\n."):
 elif data == "QUIT\n":
 reply = 'BYE'
 conn.send(reply) #send reply
 break
 else:
 print 'Received data: ' + data + " from " + addr[0] + ':' + str(addr[1])
 reply = 'OK...' + data
 conn.send(reply) #send reply 
conn.close()
s.close()

Creo que se explica solo. Podemos probarlo, aunque no tengamos implementado el cliente, con el comando nc tal y como se muestra en la imagen (o también telnet localhost 6666).

Captura de pantalla de 2014-02-02 23:22:38

Solo admite un cliente y, cuando termina la conexión, acaba. Si pusiéramos un ‘while True:’ más, justo antes del accept, al terminar un cliente, podría aceptar más, pero siempre secuencial, un cliente tras otro. ¿Cómo podemos mejorarlo para que acepte conexiones concurrentes? Utilizando procesos o hilos.

En la siguiente entrada, pongo el código de ejemplo.

Referencias:

  1. Python para todos, de Raúl González Duque

3 comentarios en “Sistemas Distribuidos: Servidor sencillo en Python

  1. Pingback: SD: Esqueleto de servidor concurrente con Python (y2) | Mundo errante

  2. Pingback: El cliente en Python | Mundo errante

  3. Pingback: Mecanismos de Comunicación entre procesos (I) | Mundo errante

Deja un comentario