Sockets en PythonGuia
Sockets en PythonGuia
FUNDAMENTOS TEÓRICOS
Un socket es muy parecido a un archivo, excepto que un solo socket proporciona una
conexión bidireccional entre dos programas. Puede leer y escribir en el mismo socket.
Si escribe algo en un socket, se envía a la aplicación en el otro extremo del socket. Si
lee desde el socket, se le dan los datos que la otra aplicación ha enviado. Pero si intenta
leer un socket cuando el programa en el otro extremo del socket no ha enviado ningún
dato, simplemente se sienta y espera. Si los programas en ambos extremos del socket
esperan algunos datos sin enviar nada, esperarán mucho tiempo; por tanto, es
requerido por los programas que se comunican a través de Internet, tener algún tipo de
protocolo.
Socket S S Socket
o o
Connection Internet Port Nro Connection
c Port Nro c
Send k k Send
e e
Receive t t Receive
Sockets en Python
Python proporciona dos niveles de acceso a los servicios de red. En un nivel bajo, se
puede acceder al soporte básico socket en el sistema operativo subyacente, lo que le
permite implementar clientes y servidores para ambos protocolos, orientados a
conexión y sin conexión. Python también tiene bibliotecas que proporcionan acceso de
nivel superior a los protocolos de nivel de aplicación específicos, tales como FTP y
HTTP.
Curso: Telemática
Vocabulario de socket
Término Descripción
Dominio La familia de protocolos que se utiliza como mecanismo
de transporte. Estos valores son constantes tales como
AF_INET, PF_INET, PF_UNIX y PF_X25.
El módulo Socket
Para crear un socket, se debe utilizar la función socket.socket () que tiene la sintaxis
general:
s = socket.socket (socket_family, socket_type, protocol=0)
SERVIDOR UDP
Una vez digitado el código anterior ejecute este comando, si está en Windows ejecute
el comando cmd para que se abra una terminal y ejecute la siguiente línea de
comando:
python Server_UDP.py
CLIENTE UDP
import socket #Librerias para utilizar Sockets
#Nombre del servidor
serverName = "localhost"
# ServerPort corresponde al puerto por donde escucha el servidor
serverPort = 12000
#Se instancia un cliente socket de tipo UDP
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
#Extrae del teclado una palabra escrita por el cliente
message = input("Introduzca una palabra: ")
#Se envia por el cliente socket el texto cargado a la variable message y se
decodifica en formato uft-8
client_socket.sendto(message.encode("utf-8"),(serverName, serverPort))
#La variable modifiedMessage extrae del cliente socket el mensaje
modifiedMessage, serverAddress = client_socket.recvfrom(2048)
#El mensaje es mostrado por pantalla
print (modifiedMessage)
#Se cierra la conexión al socket
client_socket.close()
Curso: Telemática
De igual forma que hizo con el servidor, en la línea de comando ejecute la siguiente línea
de instrucción:
python Client_UDP.py
Siga las instrucciones de la aplicación y observe el resultado en la figura 4.
Observe en la figura 5, cómo la consola del servidor muestra las peticiones que llegan
de los clientes.
https://www.wireshark.org/download.html
Antes de ejecutar tanto al cliente como al servidor, debe iniciar Wireshark, para ello
ejecute el Sniffer, vaya al menú Capture -> Option y seleccione la interfaz de Wireless
(Wi-Fi) cómo se aprecia en la figura 6.
En la misma lista del panel de paquetes haga clic en Internet Protocol Version 4, como
se aprecia en la figura 9.
Curso: Telemática
Finalmente, para observar los puertos origen y destino del tráfico UDP del socket
implementado, nuevamente en la lista de paquetes seleccione User Datagram Protocol,
como se aprecia en la figura 10.
SERVIDOR TCP
#Se importan todas las librerias de sockets
from socket import*
#puerto por donde escuchará el servidor
serverPort =12000
#Se instancia el servidor TCP
serverSocket = socket(AF_INET,SOCK_STREAM)
#Se define el puerto del servidor
serverSocket.bind(("",serverPort))
#Servidor en modo escucha
serverSocket.listen(1)
print("El servidor esta listo para recibir peticiones:")
while 1:
#Se extrae la información del puerto y la dirección ip del servidor
conSocket, addr = serverSocket.accept()
print("Recibiendo mensajes desde el cliente", addr)
#Obtiene la información extraida del cliente
msg= conSocket.recv(1024)
#Cambia el mensaje
msg_change=msg.upper()
#Se le envia el mensaje al cliente
conSocket.send(msg_change)
Una vez digitado el código anterior ejecute este comando. Si está en Windows ejecute
el comando cmd, para que se abra una terminal y ejecute la siguiente línea de
comando,como se aprecia en la figura 11.
python Server_TCP.py
Curso: Telemática
clienteSocket.send(msg.encode('utf-8'))
#Se obtiene mensaje cambiado por el servidor
msg_modified=clienteSocket.recv(1024)
#se imprime el mensaje modificado por el servidor
print("el mensaje cambiado es", msg_modified)
#Se cierra la conexión
clienteSocket.close()
En la figura 13, se puede apreciar la interacción del servidor con las peticiones de los
clientes.
A continuación, haga clic en la lista de paquetes y seleccione Ethernet, para ver la Mac
origen y Mac destino para el tráfico TCP del socket programado, como se aprecia en la
figura 15.
Curso: Telemática
Ejercicio
A continuación, se plantea el siguiente problema.
Dado un número por consola, se le pide al servidor que determine si el número digitado
por el cliente es primo o no.
Solución:
Se modificará el Server Socket TCP y el Cliente Socket TCP, para el problema en
cuestión.
Código Server_TCP_Primos
import sys #Libreria para extraer datos del teclado
#Se importan todas las librerias de sockets
from socket import*
#puerto por donde escuchará el servidor
#La función numero_primo, permite determinar si un número es primo o no.
#
def numero_primo(numero):
i=2
es_primo=True
while ((i<numero) and (es_primo)):
Curso: Telemática
if numero % i == 0:
es_primo=False
else :
i=i+1
return es_primo
serverPort =12444
#Se instancia el servidor TCP
serverSocket = socket(AF_INET,SOCK_STREAM)
#Se define el puerto del servidor
serverSocket.bind(('',serverPort))
#Servidor en modo escucha
serverSocket.listen(1)
print("El servidor está listo para recibir peticiones: ")
while 1:
#Se extrae la información del puerto y la dirección ip del servidor
conSocket, addr = serverSocket.accept()
print("Recibiendo mensajes desde el cliente", addr)
#Obtiene la información extraida del cliente
msg= conSocket.recv(1024)
n= int(msg)
new_msg="NO";
if numero_primo(n) is True:
new_msg ="SI";
conSocket.send(new_msg.encode('utf-8'))
Figura 18. Ejecución servidor socket TCP para calcular si un número es primo
Client_TCP_Primos
#Importa las librerias del sockets
from socket import*
#Se define la dirección ip a donde se va a apuntar al servidor
servername ="localhost"
#Se define el puerto por donde escucha el servidor
serverport=12444
#Se establece la instancia del cliente sockets
clienteSocket= socket(AF_INET,SOCK_STREAM)
#Se establece la conexión con el servidor
clienteSocket.connect((servername,serverport))
#Se solicita al cliente que escriba un mensaje
msg=input("Escriba un número ")
#Se envia el mensaje al servidor con formato utf-8
clienteSocket.send(msg.encode('utf-8'))
#Se obtiene mensaje cambiado por el servidor
msg_modified=clienteSocket.recv(1024)
#se imprime el mensaje modificado por el servidor
print(msg, msg_modified, " es primo")
#Se cierra la conexion
clienteSocket.close()
Curso: Telemática
Figura 19. Ejecución del cliente TCP para calcular los números primos.
Curso: Telemática
ACTIVIDADES A DESARROLLAR
A. PROTOCOLO TCP
1. Una agencia de apuestas desea diseñar un sistema que pueda hacer las siguientes
operaciones:
El sistema debe pedir el número a jugar (puede ser de 3 o 4 cifras), la lotería con la que
quiere hacer la apuesta y el valor de la apuesta. El sistema debe consultar de acuerdo a
la fecha actual qué loterías están activas para el día en que el cliente hace la apuesta.
Cuando el cliente digite el número, la lotería y el valor, el sistema del cliente debe hacer
una solicitud al servidor y verificar que la apuesta no haya superado el tope. El tope de
apuesta es definido desde el servidor. El cliente al final del día podrá consultar:
Para resolver este problema debe implementar una base de datos o en su defecto unos
archivos planos para hacer las consultas en el servidor.
Curso: Telemática
B. PROTOCOLO UDP
Referencias
Kurose, J., & Ross, K. (2017). Computer networks: A top down approach featuring the
internet. Pearson Addison Wesley.
Python https://www.python.org/
Wireshark https://www.wireshark.org/