0% encontró este documento útil (0 votos)
73 vistas26 páginas

SOCKETS EN PYTHON - New - Version

El documento describe cómo programar sockets en Python 3.8 para implementar comunicaciones cliente-servidor mediante TCP y UDP. Explica conceptos básicos de sockets, presenta ejemplos de código para un servidor y cliente UDP, e incluye capturas de pantalla que muestran la ejecución de los programas.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
73 vistas26 páginas

SOCKETS EN PYTHON - New - Version

El documento describe cómo programar sockets en Python 3.8 para implementar comunicaciones cliente-servidor mediante TCP y UDP. Explica conceptos básicos de sockets, presenta ejemplos de código para un servidor y cliente UDP, e incluye capturas de pantalla que muestran la ejecución de los programas.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 26

DEPARTAMENTO DE INGENIERIA DE SISTEMAS Y

TELECOMUNICACIONES

Asignatura: Telemática -

PROGRAMANDO SOCKETS EN PYTHON 3.8

Competencias: Al final el estudiante tendrá la capacidad de programar basada en la


arquitectura cliente servidor un socket que permita tener interacción con clientes, bien
sea TCP o UDP, de acuerdo a la necesidad que tenga que resolver.
Resultado de aprendizaje: Modela e implementa servicios orientados a la conexión y no
orientados a la conexión mediante Socket, basados en la arquitectura cliente servidor.

FUNDAMENTOS TEÓRICOS

Un socket es muy parecido a un archivo, a excepción 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 simplemente esperan algunos datos sin enviar nada, esperarán mucho tiempo,
por lo que una parte importante de los programas que se comunican a través de Internet
es tener algún tipo de protocolo.
Es importante recordar que un protocolo es un conjunto de reglas precisas que
determinan quién debe ir primero, qué deben hacer y luego cuáles son las respuestas a
ese mensaje, quién envía a continuación, y así sucesivamente. En cierto sentido, las dos
aplicaciones en cada extremo se sincronizan. En las figuras 1 y 2 se puede apreciar
como se genera los procesos de comunicación entre un cliente y un servidor.
DEPARTAMENTO DE INGENIERIA DE SISTEMAS Y
TELECOMUNICACIONES

Asignatura: Telemática -

Figura 1. Comunicación de procesos por sockets mediante el protocolo TCP

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

Program Client Program Server

Figura 2. Comunicación de procesos por sockets


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 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)

Esta es la descripción de los parámetros –


• socket_family: Este es o bien AF_UNIX o AF_INET, como se explicó anteriormente.
DEPARTAMENTO DE INGENIERIA DE SISTEMAS Y
TELECOMUNICACIONES

Asignatura: Telemática -

• socket_type: Esto es bien SOCK_STREAM o SOCK_DGRAM.


• protocolo: Esto generalmente se queda fuera, por defecto a 0.
Una vez que tenga toma de objeto, entonces usted puede utilizar las funciones
necesarias para crear su cliente o programa servidor. A continuación, se presenta la lista
de funciones es necesario

Métodos Socket Server


Procedimiento Descripción

s.bind () Este método se une electrónico (nombre de host, el par número


de puerto) a la toma.

s.listen () Este método establece y empezar oyente TCP.

s.accept () Este pasivamente aceptar conexión de cliente TCP, esperando


a que llegue la conexión (bloqueo).

Métodos Socket Cliente


Procedimiento Descripción

s.connect () Este método inicia activamente conexión de servidor TCP.

Métodos generales de Socket


Procedimiento Descripción

s.recv () Este método recibe el mensaje TCP


DEPARTAMENTO DE INGENIERIA DE SISTEMAS Y
TELECOMUNICACIONES

Asignatura: Telemática -

s.send () Este método transmite el mensaje TCP

s.recvfrom () Este método recibe el mensaje UDP

s.sendto () Este método transmite mensaje UDP

s.close () Este método cierra socket

socket.gethostname () Devuelve el nombre de host.


DEPARTAMENTO DE INGENIERIA DE SISTEMAS Y
TELECOMUNICACIONES

Asignatura: Telemática -
DEPARTAMENTO DE INGENIERIA DE SISTEMAS Y
TELECOMUNICACIONES

Asignatura: Telemática -

IMPLEMENTACIÓN DE SOCKET EN PYTHON

Requisitos
Instale en su computador la versión de Python 3.8.2
https://www.python.org/downloads/release/python-382/

A continuación, se implementarán dos servicios de la capa de transporte utilizando


Sockets en Pythons para UDP

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 -

Figura 3. Líneas de comandos para ejecutar el servidor UDP

A continuación, digite el código para el cliente UDP

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 -

#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()

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

Siga las instrucciones de la aplicación y observe el resultado en la figura 4

Figura 4. Línea de comando para ejecutar el cliente UDP


DEPARTAMENTO DE INGENIERIA DE SISTEMAS Y
TELECOMUNICACIONES

Asignatura: Telemática -

Observe en la figura 5, como la consola del servidor muestra las peticiones que llegan
de los clientes

Figura 5. Línea de comando del servidor recibiendo respuesta de los clientes.


DEPARTAMENTO DE INGENIERIA DE SISTEMAS Y
TELECOMUNICACIONES

Asignatura: Telemática -

Análisis de tráfico por Wireshark para UDP


Instale Wireshark Version 3.4.10
https://www.wireshark.org/download.html

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.

Figura 6. Analizador de tráfico Wireshark

Posteriormente en la caja de texto de filtros escriba UDP, como se aprecia en la figura


7
DEPARTAMENTO DE INGENIERIA DE SISTEMAS Y
TELECOMUNICACIONES

Asignatura: Telemática -

Figura 7. Selección para el filtro UDP

Luego haga clic en la lista de panel de paquetes y seleccione Ethernet, como se


aprecia en la figura 8. De tal forma que puede saber la mac origen y la mac destino del
tráfico UDP.

Figura 8. Lista de paquetes, Ethernet

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 -

Figura 9. Lista de paquetes, para IP V4

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.

Figura 10. Lista de paquetes para UDP.


DEPARTAMENTO DE INGENIERIA DE SISTEMAS Y
TELECOMUNICACIONES

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 -

Figura 11. Línea de comando para ejecutar el servidor TCP

A continuación, digite el código para el cliente TCP


CLIENTE TCP
#Importa las librerias del sockets
from socket import*
#Se define la dirección ip a donde se va a apuntar al servidor
servername ="192.168.1.200"
#Se define el puerto por donde escucha el servidor
serverport=12000
#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 una palabra")
#Se envia el mensaje al servidor con formato utf-8
DEPARTAMENTO DE INGENIERIA DE SISTEMAS Y
TELECOMUNICACIONES

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()

Ejecute la línea de comando para cliente, como se aprecia en la figura 12.


python Client_TCP.py

Figura 12. Línea de comando para ejecutar el cliente TCP


DEPARTAMENTO DE INGENIERIA DE SISTEMAS Y
TELECOMUNICACIONES

Asignatura: Telemática -

En la figura 13, se puede apreciar la interacción del servidor con las peticiones de los
clientes.

Figura 13. Interacción del servidor TCP con clientes TCP.


DEPARTAMENTO DE INGENIERIA DE SISTEMAS Y
TELECOMUNICACIONES

Asignatura: Telemática -

Análisis de tráfico para el protocolo con sockets TCP

Observación siempre ejecute el Sniffer antes de ejecutar el servidor y cliente Socket

Filtre el tráfico con TCP como se aprecia en la figura 14

Figura 14. Filtrando tráfico TCP

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 -

Figura 15. Lista de paquetes, Ethernet


A continuación, para observar la Ip origen y destino del servidor y cliente del socket
programado, tal y como se aprecia en la figura 16.

Figura 16. Lista de paquetes, IP V4


Finalmente, para observar los puertos origen y destino, se hace clic en la lista de
paquetes en Transmission Control Protocol del socket programado, tal y como se aprecia
en la figura 17.
DEPARTAMENTO DE INGENIERIA DE SISTEMAS Y
TELECOMUNICACIONES

Asignatura: Telemática -

Figura 17. Lista de paquetes, paquetes TCP.

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 del Cliente Socket TCP, para de 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)):
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

Tal y como se observa en la figura 18.


DEPARTAMENTO DE INGENIERIA DE SISTEMAS Y
TELECOMUNICACIONES

Asignatura: Telemática -

Figura 18. Ejecución servidor socket TCP para calcular si un número es primo

Seguidamente elabore el siguiente código para el cliente

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 -

Ejecute la siguiente línea de comandos


python Client_TCP_Primos.py

Al final tendrá el resultado como se observa en la figura 19

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 -

c. El FOSYGA, desea que le implementen una aplicación que permita de acuerdo a su


número de identificación a que EPS pertenece y su nivel de SISBEN
Para resolver el problema debe implementar una base de datos o un sistema de archivos
del lado del servidor.

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/

También podría gustarte