Introducción a sockets en python




Hola a todos los que aun siguen este pequeño blog olvidado, espero inyectarle un poco de vida a este blog con nuevas entradas, en esta ocacion explicare un poco lo que son los sockets en python y haremos unos pequeños scripts en python de un cliente y servidor, los cuales enviaran y recibirán instrucciones, en pocas palabras cadenas de textos.


Sockets

De acuerdo con wikipedia los sockets son un concepto abstracto por el cual dos programas (posiblemente situados en computadoras distintas) pueden intercambiar cualquier flujo de datos, generalmente de manera fiable y ordenada.

El termino socket es también usado como el nombre de una interfaz de programación de aplicaciones para la familia de protocolos de internet TCP/IP, provista usualmente por el sistema operativo.
Los sockets de internet constituyen el mecanismo para la entrega de paquetes de datos provenientes de las tarjetas de red a los procesos o hilos apropiados. Un socket queda definido por un par de direcciones IP local y remota, un protocolo de transporte y un par de números de puerto local y remoto.



El modelo de programación distribuida que sería popularizado por el API de sockets era el modelo cliente/servidor, en donde hay un servidor y un grupo de clientes. Los clientes envían mensajes al servidor pidiéndole que haga trabajo en su nombre, esperan que el servidor realice el trabajo pedido, y en algún momento posterior reciben una respuesta. Hoy en día este modelo computacional es tan utilizado que a menudo es el único modelo con el que muchos ingenieros de software están familiarizados. Sin embargo, en el momento que fue diseñado, era visto como una manera de extender el modelo de I/O de Unix a través de una red. Otro factor que llevó al API de sockets hacia el modelo cliente/servidor fue que el protocolo más popular que soportaba, TCP, era un modelo comunicacional 1:1.
El API de sockets hizo que el modelo cliente/servidor fuera fácil de implementar, porque el programador podía usar una pequeña cantidad de llamadas de sistema y agregarlas a su código existente ("desconectado") para aprovechar otros recursos computacionales. Aunque era posible usar otros modelos, el API de sockets hizo que el modelo cliente/servidor dominara al mundo de las redes.

Programando los sockets
Ahora que ya sabemos que son los sockets, explicare mediante un ejemplo sencillo como programarlos en python, la forma de explicacion sera como habitual mente se hace en este blog, colocare el codigo y seguidamente explicare cada una de sus sentencias para que el lector pueda entender claramente el codigo, bueno comencemos.
script cliente:
1.-  #!/usr/bin/python
2.-  import socket
3.-
4.-  sock = socket.socket()
5.-  sock.connect((“localhost”, 5000))
6.-
7.-  while True:
8.-           mensaje = raw_input(“#>”)
9.-           sock.send(mensaje)
10.-          if mensaje == “exit”:
11.-                    break
12.- print “Bye”

13.- sock.close()



En la linea 1 colocamos el shebang para el interprete de python en gnu/linux:

          #!/usr/bin/python

En la linea 2 se encuentra la importacion del modulo socket, para el manejo de sockers en python
          import socket

En la linea 4 se encuentra la instanciacion del objeto socket en la variable sock

          sock = socket.socket()

En la linea 5 realizamos la conexión con el servidor, la sentencia connect, esta compuesta de una tupla que pide como parametro el host y el puerto del servidor para realizar la conexión, en este ejemplo usaremos como host el localhost, que para el despistado el localhost es nuestro propio ordenador que igual es representado por 127.0.0.1, y utilizaremos el puerto 5000, para el que no sabe esto la cantidad maxima de puestos logicos en un ordenador es de 65535 puertos, pero eso ya es otro tema que abordaremos en una entrada relacionada con redes o sistemas operativos.

          sock.connect((“localhost”, 5000))

En la linea 7 iniciamos un bucle infinito mediante la sentencia while y el valor booleano True con el fin de poder repetir indefinidamente las sentencias siguientes.

          while True:

En la linea 8 inicializamos la variable mensaje con el valor de retorno del metodo raw_input, el metodo raw_input retorna el buffer de entrada, que podrian ser datos del teclado.

          mensaje = raw_input(“#> ”)

En la linea 9 utilizamos en metodo send del modulo socket el cual anteriormente inicializamos, la finalidad de este metodo es enviar datos por la conexión del socket hacia el servidor, asi que enviaremos la variable mensaje

          sock.send(mensaje)

En la linea 10 y 11 se encuentra la condicion if que determinara si la variable mensaje es igual a “exit” si en dado caso lo es se ejecuta la sentencia break que rompe el bucle infinito y termina el programa.

          if mensaje == “exit”:
                    break

En la linea 12 se encuentra la sentencia print que enviara un mensaje de Bye si se concluye el while

          print “Bye”

En la linea 13 se encuentra el metodo close del objeto socket, este metodos finaliza la conexión del socket con el servidor.


          sock.close()



script servidor:
1.-  #!/usr/bin/python
2.-  import socket
3.-  
4.-  sock = socket.socket()
5.-  sock.bind((“localhost”, 5000))
6.-  sock.listen(1)
7.-  
8.-  source, adreess = sock.accept()
9.-  
10.- while True:
11.-           datos = source.recv(1024)
12.-          if datos == “exit”:
13.-                     break
14.-          print “Se recibio:”, datos
15.-          source.send(datos)
16.- print “Bye”
17.- source.close()
18.- sock.close()


En la linea 1 colocamos el shebang para el interprete de python en gnu/linux:

          #!/usr/bin/python

En la linea 2 se encuentra la importacion del modulo socket, para el manejo de sockers en python
          import socket

En la linea 4 se encuentra la instanciacion del objeto socket en la variable sock

          sock = socket.socket()

En la linea 5 especificamos mediante una tupla el cliente que tendra acceso al servidor y el puerto por el cual el servidor se mantendra a la escucha a espera de el cliente, si en dado caso queremos que cualquier cliente se pueda conectar dejamos el primer campo vacio entre comillas pero en este caso especificaremos al localhost como el unico que puede conectarse al servidor , ademas de eso especificamos que escucharemos a los clientes en el puerto 5000.

          sock.bind((“localhost”, 5000))

En la linea 6 especificamos cuantos clientes aceptara el servidor, mediante la sentencia listen, en este caso solo aceptamoas un solo cliente.

          sock.listen(1)

En la linea 8 aceptamos la conexión entrante del cliente.

          source, adreess = sock.accept()

En la linea 10 iniciamos un bucle infinito mediante la sentencia while y el valor booleano True con el fin de poder repetir indefinidamente las sentencias siguientes.

          while True:

En la linea 11 inicializamos la variable datos con los datos provenientes del cliente, que en este caso es el valor de la variable mensaje en el script del cliente socket

          datos = source.recv(1024)

En la linea 12 y 13 especificamos una condicion if que verifica que el dato recibido sea igual a “exit”, en dado caso de que sea igual a exit, ejecuta la sentencia break y termina el bucle infinito.

          if datos == “exit”:
                    break

En la linea 14 mandamos a imprimir en pantalla el mensaje “Se recibio: ” seguido del dato proveniente de la comunicación con el clientes

          print “Se recibio:”, datos

En la linea 15 se envia el valor de la variable datos al cliente conectado al servidor.

          source.send(datos)

En la linea 16 ya fuera del bucle infinito se imprime en pantalla el mensaje Bye indicando que se concluira el script.

          print “Bye”

En la linea 17 y 18 indicamos el cierre de la conexión con el cliente conectado al servidor y el cierre de servidor creado.

          source.close()
          sock.close()


con eso concluye esta nueva entrada, creo que aplazar una entrada por dos semanas en contraproducente asi que cada semana lanzare una nueva, en esta ocacion el tiempo y la falta de microfono no ayudo en realizar un videotutorial de este tema, pero espero que la proxima entrada pueda lanzar junto con su version escrita una version en video, ademas de esto la encuenta para el proximo tema en abordar quedo en un triple empate por eso, omitire para la proxima un tema de programacion y tomare como el siguiente tema, los sistemas operativos.

Comentarios