SOCKETS EN PYTHON - New - Version
SOCKETS EN PYTHON - New - Version
TELECOMUNICACIONES
Asignatura: Telemática -
FUNDAMENTOS TEÓRICOS
Asignatura: Telemática -
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
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 red de nivel de aplicación específicos, tales como FTP,
HTTP, y así sucesivamente. En este capítulo se da entender en el concepto más famoso
en Redes - Socket programación.
DEPARTAMENTO DE INGENIERIA DE SISTEMAS Y
TELECOMUNICACIONES
Asignatura: 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, PF_X25, y así
sucesivamente.
escribe El tipo de comunicaciones entre los dos puntos finales,
normalmente SOCK_STREAM para protocolos
orientados a la conexión y SOCK_DGRAM de protocolos
sin conexión.
protocolo Típicamente cero, esto puede ser utilizado para identificar
una variante de un protocolo dentro de un dominio y el
tipo.
nombre de host El identificador de una interfaz de red:
• Una cadena, que puede ser un nombre de host, una
dirección decimal con puntos, o una dirección IPv6 en dos
puntos (y posiblemente dot) notación
• Una cadena "", que especifica una dirección
INADDR_BROADCAST. • Una cadena de longitud cero,
que especifica INADDR_ANY
• Un entero, interpretado como una dirección binaria en
orden de bytes de acogida.
Puerto Cada servidor escucha para los clientes piden a uno o
más puertos. Un puerto puede ser un número Fixnum
puerto, una cadena que contiene un número de puerto o
el nombre de un servicio.
El módulo Socket
Para crear un socket, debe utilizar el socket.socket () función disponible de socket, que
tiene la sintaxis general -
s = socket.socket (socket_family, socket_type, protocol=0)
Asignatura: Telemática -
Asignatura: Telemática -
Asignatura: Telemática -
DEPARTAMENTO DE INGENIERIA DE SISTEMAS Y
TELECOMUNICACIONES
Asignatura: Telemática -
Requisitos
Instale en su computador la versión de Python 3.8.2
https://www.python.org/downloads/release/python-382/
SERVIDOR UDP
from socket import *
serverPort = 12000
serverSocket = socket(AF_INET, SOCK_DGRAM)
serverSocket.bind(('', serverPort))
print ("The server is ready to receive")
while 1:
message, clientAddress = serverSocket.recvfrom(2048)
modifiedMessage = message.upper()
serverSocket.sendto(modifiedMessage, clientAddress)
Una vez digitado el código anterior ejecute este comando, si esta en Windows ejecute
el comando cmd, para que se abra una terminal: ejecute la siguiente línea de comando
python Server_UDP.py
DEPARTAMENTO DE INGENIERIA DE SISTEMAS Y
TELECOMUNICACIONES
Asignatura: Telemática -
CLIENTE UDP
import socket #Librerias para utilizar Sockets
import sys #Libreria para extraer datos del teclado
#Nombre del servidor; puede cambiarse por la dirección ip del servidor ejemplo
192.168.10.15
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)
#Extra del teclado una palabra escrita por el cliente
message = input('Introduzca una palabra:')
DEPARTAMENTO DE INGENIERIA DE SISTEMAS Y
TELECOMUNICACIONES
Asignatura: Telemática -
De igual forma que abra con la línea de comando por la terminal y ejecute la siguiente
línea de instrucción
python Client_UDP.py
Asignatura: Telemática -
Observe en la figura 5, como la consola del servidor muestra las peticiones que llegan
de los clientes
Asignatura: Telemática -
Antes de ejecutar tanto al cliente como al servidor, de ejecutar 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.
Asignatura: Telemática -
En la misma lista del panel de paquetes, haga clic en Internet Protocol V4, como se
aprecia en la figura 9.
DEPARTAMENTO DE INGENIERIA DE SISTEMAS Y
TELECOMUNICACIONES
Asignatura: 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.
Asignatura: Telemática -
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 sevidor esta listo para recibir peticiones: ")
while 1:
#Se extrae la información de el 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: ejecute la siguiente línea de comando,
como se aprecia en la figura 11.
python Server_TCP.py
DEPARTAMENTO DE INGENIERIA DE SISTEMAS Y
TELECOMUNICACIONES
Asignatura: Telemática -
Asignatura: 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()
Asignatura: Telemática -
En la figura 13, se puede apreciar la interacción del servidor con las peticiones de los
clientes.
Asignatura: Telemática -
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.
DEPARTAMENTO DE INGENIERIA DE SISTEMAS Y
TELECOMUNICACIONES
Asignatura: Telemática -
Asignatura: Telemática -
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)):
DEPARTAMENTO DE INGENIERIA DE SISTEMAS Y
TELECOMUNICACIONES
Asignatura: 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 sevidor 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'))
Nuevamente
Ejecute la siguiente instrucción
python Server_TCP_Primos.py
Asignatura: Telemática -
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()
DEPARTAMENTO DE INGENIERIA DE SISTEMAS Y
TELECOMUNICACIONES
Asignatura: Telemática -
Figura 19. Ejecución del cliente TCP para calcular los números primos.
DEPARTAMENTO DE INGENIERIA DE SISTEMAS Y
TELECOMUNICACIONES
Asignatura: Telemática -
ACTIVIDAD A DESARROLLAR
1. Modifique los códigos anteriores y realice el siguiente ejercicio
- Dados 3 números reales, decir que tipo de triangulo es (Equilátero, Escaleno o
Isósceles). Los datos los pide el cliente y el servidor ejecuta el algoritmo que
determina qué tipo de triangulo corresponde y le devuelve la respuesta al cliente
UDP.
2. Utilice dos máquinas, una funcionará como servidor y la otra como cliente, en la máquina
cliente ejecute Wireshark y analice la trama UDP
3. Modifique los códigos anteriores y realice los siguientes ejercicios
a. 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 que 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:
o Cuál fue el número más jugado de acuerdo a la lotería
o El monto total recaudado de acuerdo a todas las apuestas.
o El monto recaudado por loterías
o El número menos jugado.
b. La Registraduría Nacional del Estado Civil de Colombia, lo ha contratado a usted para
que resuelva el siguiente problema.
Se desea desarrollar un sistema que permita capturar desde un cliente su identificación
y este a su vez haga una solicitud a un servidor para que consulte si es jurado de
votación, en el caso afirmativo debe decir la mesa en donde el ciudadano debe asistir
como jurado. De igual forma el sistema del lado del cliente debe permitir consultar en
qué lugar puede votar un ciudadano de acuerdo a su cedula.
Para resolver este problema debe implementar una base de datos o en su defecto unos
archivos planos para hacer las consultas en el servidor.
DEPARTAMENTO DE INGENIERIA DE SISTEMAS Y
TELECOMUNICACIONES
Asignatura: Telemática -
Para resolver este problema debe implementar una base de datos del lado del servidor junto con
las restricciones descritas en el problema.
4. Utilice dos máquinas, una funcionará como servidor y la otra como cliente, en la máquina
servidor ejecute Wireshark y analice las trama TCP
Referencias
Kurose, J., & Ross, K. (2017). Computer networks: A top down approach featuring the internet. Peorsoim
Addison Wesley.
Wireshark https://www.wireshark.org/docs/relnotes/wireshark-3.4.10.html
DEPARTAMENTO DE INGENIERIA DE SISTEMAS Y
TELECOMUNICACIONES
Asignatura: Telemática -
Python https://www.python.org/