Code used to implement a simple client-server communication.
client code
#! usr/bin/python import socket print "teclear-- -----para" print "sum n -> suma los primeros n enteros" print "prim n -> muestra los primeros n numeros primos" host = 'localhost' port = 50000 size = 1024 seguir = 1 while (seguir == 1): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((host,port)) peticion = raw_input("tarea a realizar ") tarea = peticion.split() print tarea s.send(peticion) data = s.recv(size) #esperamos por todos los datos posible cadena = data while(data != 'EOF'): cadena = cadena+data s.send('ack') data = s.recv(size) if tarea[0] == 'prim': print "primeros %d " %int(tarea[1]), print "numeros primos" primos = cadena.split()#convertir la cadena en lista contador = 0 for primo in primos: print str(primo), if contador > 9: print "\n" contador = 0 contador += 1 print "\n" elif tarea[0] == 'sum': print "suma de los %d " %int(tarea[1]), print "primeros numeros enteros" print cadena s.close() salir = raw_input("terminar sesion (y/n):") if salir == 'y': seguir = 0
Server Code
#! usr/bin/python import socket from math import ceil from math import sqrt from sys import getsizeof def primos(cuantos): if cuantos == 1: lista_primos = ["1"] elif cuantos == 2: lista_primos = ["1", "2"] else: faltan = cuantos - 2 esprimo = 3 lista_primos = ["1","2"] while(faltan>0): np = primo(esprimo) if np == 1: lista_primos.append(str(esprimo)) faltan -= 1 esprimo += 1 print lista_primos return " ".join(lista_primos) def primo(posible_primo): primo = 1 if (posible_primo % 2) == 0: primo = 0 else: max_divisor = int(ceil(sqrt(posible_primo))) for i in range(3, max_divisor + 1): if (posible_primo % i) == 0: primo = 0 break return primo def sumaN(n): suma = (n*(n+1))/2 return str(suma) host = '' port = 50000 backlog = 5 size = 1024 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind((host,port)) s.listen(backlog) while 1: client, address = s.accept() peticion = client.recv(size) data = peticion.split() print "recibimos " +str(data) if data[0] == 'prim': numero = int(data[1]) #cuantos quieren resultado = primos(numero) elif data[0] == 'sum': numero = int(data[1])#cuantos resultado = sumaN(numero) #no cabe en un solo paquete if getsizeof(resultado) > size: contador = 0 while(contador + size < getsizeof(resultado)): por_enviar = resultado[contador:contador+size] client.send(por_enviar)#enviar lo obtenido client.recv(size)#esperamos contestacion contador+=size if contador < getsizeof(resultado):#no se enviaron todos los datos client.send(resultado[contador:])#enviar lo que resta client.recv(size)#esperamos contestacion client.send("EOF")#cerramos la conexion else:#cabe en un solo paquete client.send(resultado)#enviar lo obtenido client.recv(size) client.send("EOF") #terminamos la transmicion client.close()Next, an explanation of some parts of the code used to implement the client-server program showed in the presentation.
Client code
import socket host = 'localhost' port = 50000 size = 1024
Indicate the host and port of the machine we want to communicate with and the maximum size of bytes we can send to the other machine with the send() function.
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((host,port))Create a socket an open a connection with a host and port numbers.
peticion = raw_input("tarea a realizar ") tarea = peticion.split() print tarea s.send(peticion)Ask for a request and send it to server.
data = s.recv(size) #esperamos por todos los datos posible cadena = data while(data != 'EOF'): cadena = cadena+data s.send('ack') data = s.recv(size)In case the server sends more data than the one function send() can handle, we wait until all data has been sent.
if tarea[0] == 'prim': ..... ..... elif tarea[0] == 'sum': ..... ..... s.close() salir = raw_input("terminar sesion (y/n):") if salir == 'y': seguir = 0Checks what kind of request we made to the server and prints the data sent from the server in the correct format.Also ask for leaving or not the session, if we keep in the session it opens a socket connection because the actual socket connection is closed before asking for leaving or not the session.
Server code
client, address = s.accept() peticion = client.recv(size) data = peticion.split() print "recibimos " +str(data) if data[0] == 'prim': numero = int(data[1]) #cuantos quieren resultado = primos(numero) elif data[0] == 'sum': numero = int(data[1])#cuantos resultado = sumaN(numero)Accepts connections and checks the clients requests, those requests call the primos and sumaN functions.
if getsizeof(resultado) > size: contador = 0 while(contador + size < getsizeof(resultado)): por_enviar = resultado[contador:contador+size] client.send(por_enviar)#enviar lo obtenido client.recv(size)#esperamos contestacion contador+=size if contador < getsizeof(resultado):#no se enviaron todos los datos client.send(resultado[contador:])#enviar lo que resta client.recv(size)#esperamos contestacion client.send("EOF")#cerramos la conexion else:#cabe en un solo paquete client.send(resultado)#enviar lo obtenido client.recv(size) client.send("EOF") #terminamos la transmicion client.close()Once we call the functions that compute the clients requests, make sure that all the data can be sent no matter if exceeds the limit size of the send() function and close the connection.
The functions are defined as usual in any python code. As you can see this example works for just one client-server connection at a time, later implementations using threads can avoid this limitation.
Based in the code examples from:
http://ilab.cs.byu.edu/python/
Confirmo aquí los 6+2 otorgados el día de la presentación.
ReplyDelete