socket en python

Socket en Python – Crear una conexión Cliente/Servidor

En esta sencilla entrada veremos como realizar de forma sencilla una conexión cliente/servidor utilizando el módulo Socket en Python, que no es más que un canal de comunicación que permite conectar dos equipos a través de la red (normalmente cliente-servidor). La separación entre cliente servidor en estas conexiones es de tipo lógico. Esto significa que no es necesario tener corriendo el servidor en una única máquina, sino que puede estar en varias, e incluso en varios programas.

Socket es un módulo estándar del lenguaje de programación Python (y de otros muchos) que proporciona una interfaz de bajo nivel que permite conexiones TCP/IP y UDP. Esto ofrece soluciones sencillas a problemas sencillos. Si necesitamos trabajar con servidor, podremos usar el módulo socketserver. Cabe destacar que cuando se abre la conexión cñoente-servidor, las vias de comunicación son bidireccionales por lo que ambas pueden emitir y recibir mensajes a través del socket.

Un programa cliente-servidor es aquel que abre una conexión entre ambos y permite su comunicación. El cliente realiza peticiones al servidor que la escucha antes de emitir una respuesta. Para que te hagas una idea y familiarices la idea de este tipo de conexiones, son las que se realizan con esta página web, alojada en un servidor y sois vosotros, los lectores de este blog, los que hacéis peticiones al servidor (hosting) para poder leer su contenido.

¿Por qué Python? Porque se trata de un lenguaje muy sencillo y práctico, y porque copiando las siguiente líneas en un cliente y en un servidor, puedes tener esto funcionando en cuestión de minutos.

Codificando el socket en Python

Para empezar vamos a crear la codificación que deberás crear para la parte Cliente:

#!/usr/bin/env python

#Variables
host = 'localhost'
port = 8050
#Se importa el módulo
import socket
 
#Creación de un objeto socket (lado cliente)
obj = socket.socket()
 
#Conexión con el servidor. Parametros: IP (puede ser del tipo 192.168.1.1 o localhost), Puerto
obj.connect((host, port))
print("Conectado al servidor")
 
#Creamos un bucle para retener la conexion
while True:
    #Instanciamos una entrada de datos para que el cliente pueda enviar mensajes
    mens = raw_input("Mensaje desde Cliente a Servidor >> ")
 
    #Con el método send, enviamos el mensaje
    obj.send(mens)

#Cerramos la instancia del objeto servidor
obj.close()

#Imprimimos la palabra Adios para cuando se cierre la conexion
print("Conexión cerrada")

Por otro lado, esta que sigue debe ser la codificación del socket en Python a poner en la parte Servidor:

#!/usr/bin/env python
 
#Se importa el módulo
import socket
 
#instanciamos un objeto para trabajar con el socket
ser = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 
#Puerto y servidor que debe escuchar
ser.bind(("", 8050))
 
#Aceptamos conexiones entrantes con el metodo listen. Por parámetro las conexiones simutáneas.
ser.listen(1)
 
#Instanciamos un objeto cli (socket cliente) para recibir datos
cli, addr = ser.accept()

while True:

    #Recibimos el mensaje, con el metodo recv recibimos datos. Por parametro la cantidad de bytes para recibir
    recibido = cli.recv(1024)

    #Si se reciben datos nos muestra la IP y el mensaje recibido
    print "Recibo conexion de la IP: " + str(addr[0]) + " Puerto: " + str(addr[1])

    #Devolvemos el mensaje al cliente
    cli.send(mensaje recibido)

#Cerramos la instancia del socket cliente y servidor
cli.close()
ser.close()

print("Conexiones cerradas")

Este código es 100% funcional. Tan sólo deberéis cambiar vuestra IP (si no usais localhost) y vuestro puerto para que funcione a la perfección.

A tener en cuenta:

  • En el servidor, si trabajar en un servidor Apache como XAML en tu local, deberás poner localhost. Si trabajas con IPS, no olvides cambiarla.
  • La misma consideración hay que tener en cuenta para el puerto, debemos cambiarlo a nuestro puerto (creo que por defecto es 9999 o 9998).
  • En el código de servidor hemos puesto addr[0] que hace referencia al host y addr[1] que lo hace al puerto.
  • Si utilizas Windows y falla la conexión, revisa el Firewall de Windows y añade Python como excepción.
  • Los dos ficheros (tanto cliente como servidor) deben tener extensión .py
  • Recuerda que debes ejecutar el código en dos ventanas SSH diferentes para que se puedan comunicar entre ellas.

Creo que no se me escapa nada y que os haya servido este pequeño tutorial de Sockets en Python para poder realizar una conexión cliente/servidor a través de TCP o UDP.

 

4 comentarios en “Socket en Python – Crear una conexión Cliente/Servidor”

  1. Juan Villarreal

    asi funciona con python 3
    server
    #!/usr/bin/env python

    #Se importa el módulo
    import socket

    #instanciamos un objeto para trabajar con el socket
    ser = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    #Puerto y servidor que debe escuchar
    ser.bind((“”, 8050))

    #Aceptamos conexiones entrantes con el metodo listen. Por parámetro las conexiones simutáneas.
    ser.listen(1)

    #Instanciamos un objeto cli (socket cliente) para recibir datos
    cli, addr = ser.accept()

    while True:

    #Recibimos el mensaje, con el metodo recv recibimos datos. Por parametro la cantidad de bytes para recibir
    recibido = cli.recv(1024)

    #Si se reciben datos nos muestra la IP y el mensaje recibido
    print(“Recibo conexion de la IP: ” + str(addr[0]) + ” Puerto: ” + str(addr[1]))
    print(recibido)
    #Devolvemos el mensaje al cliente
    #cli.send(“mensaje recibido”)
    msg_toSend=(“mensaje recibido desde el cliente como estas Jerry”)
    cli.send(msg_toSend.encode(‘ascii’))

    #Cerramos la instancia del socket cliente y servidor
    cli.close()

    client
    #!/usr/bin/env python

    #Variables
    host = ‘localhost’
    port = 8050
    #Se importa el módulo
    import socket

    #Creación de un objeto socket (lado cliente)
    obj = socket.socket()

    #Conexión con el servidor. Parametros: IP (puede ser del tipo 192.168.1.1 o localhost), Puerto
    obj.connect((host, port))
    print(“Conectado al servidor”)

    #Creamos un bucle para retener la conexion
    while True:
    #Instanciamos una entrada de datos para que el cliente pueda enviar mensajes
    mens = input(“Mensaje desde Cliente a Servidor >> “)
    #Con el método send, enviamos el mensaje
    obj.send(mens.encode(‘ascii’))
    #obj.send(mens)
    recibido = obj.recv(1024)
    print(recibido)

    #Cerramos la instancia del objeto servidor
    obj.close()

    #Imprimimos la palabra Adios para cuando se cierre la conexion
    print(“Conexión cerrada”)

  2. Juan Villarreal

    gracias me sirvio bastante es la primera vez que veo sockets yo programaba el siglo pasado en foxpro y ahora me gusto python de hobbie y tu ejemplo mehizo pasarme un dia muy motivado solo le quite las incompattibilidades con python 2 y le inlui lo que he aprendido de python 3 gracias de nuevo

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *