Tutorial 18, Sockets en python.

Hola a tod@s de nuevo, hoy os voy a hablar sobre un concepto nuevo, los sockets, los sockets son una forma abstracta de llamar a los puntos finales de una conexión entre dos ordenadores, gracias a esto, podemos hacer que un ordenador le envíe un dato a otro comunicándose entre ellos a través de internet.



Un socket esta formado por una ip, un puerto, y un protocolo.

Vamos a intentar hacer un programa cliente servidor hecho con sockets, lo primero que tenemos que hacer es importar el módulo socket:

import socket

Ahora creamos nuestro socket:

socket_servidor=socket.socket()

Ponemos el socket a la escucha con el método bind:

socket_servidor.bind(("localhost", 9999))

Como veis al método bind, se le pasa una tupla que contiene el host y el puerto.

Y utilizamos el método listen para poner el socket a escuchar pasándole el número máximo de conexiones que queremos aceptar:

socket_servidor.listen(1)

El método accept, desbloquea el flujo del programa cuando se crea la conexión devolviendo un socket que representa al cliente y una tupla con su ip y puerto:

socket_cliente, ("ip_cliente","puerto_cliente") = socket_servidor.accept()

Una vez que se a establecido la conexión, podemos enviar y recibir mensajes con los métodos send y recv:

mensaje=raw_input("escribe el mensaje") 
socket_cliente.send(mensaje)
print recv(1500)

A send se le pasa el mensaje a enviar y a recv el máximo de bytes a aceptar.

Para cerrar un socket se utiliza el método close().

Crear un cliente es aún mas fácil, simplemente importamos el módulo, creamos el socket y establecemos la conexión con el servidor:

import socket

mi_socket=socket.socket()
mi_socket.connect(("localhost", 9999))

Y ya esta, nos conectamos con el método connect al cual se le pasa una tupla con el host y el puerto al igual que el método bind.

Ahora, voy a aplicar todo esto a un ejemplo, un chat sencillo:

Código servidor:

import socket

socket_s=socket.socket()
socket_s.bind(("localhost", 999))
socket_s.listen(1)

socket_c, (ip_c, puerto_c)=socket_s.accept()
print "conexion establecida con el cliente"


while True:
  mensaje=socket_c.recv(150)
  print mensaje


Código cliente:

import socket

mi_socket=socket.socket()
mi_socket.connect(("localhost", 999))
while True:
  mensaje=raw_input("Escribe el mensaje a enviar...")
  mi_socket.send(mensaje)

Ya está, así de simple, eso si, en este ejemplo, el cliente puede mandar mensajes al servidor, pero no al revés, ya que quería hacer algo sencillo para que pudiérais entenderlo mejor, pero, con los sockets puedes hacer lo que quieras, yo en sus momentos hice un escaneador de puertos sencillo con try y con sockets que ya os comenté en su momento, y algo aún mas interesante, una shell remota, es decir, que desde un ordenador podamos enviar comandos a ordenador usando llamadas al sistema, en vez de enviar un mensaje de texto se envian comandos, es algo muy sencillo de hacer.

Os dejo el escaneador de puertos del que os he hablado:

import socket
def a():
       #definimos el tipo de socket y el protocolo
       s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
       host=raw_input("Escribe el nombre del host ")
       uno=input("primer valor del rango ")
       dos=input("segundo valor para el rango ")
       f=open("log.txt", "a")
       f.write("-----------------" + " HOST= " + str(host) + " puertos desde " + str(uno) + " hasta " + str(dos-1) + " ------------------\n")
       
       for x in range(uno, dos):
                try:
                           s.connect((host, x))
                           print "puerto " + str(x) + "abierto"
                           f.write("puerto " + str(x)+ " abierto\n")
                           s.close()
                 except:
                           print "puerto " + str(x) + " cerrado"
                           f.write("puerto " + str(x)+ " cerrado\n")
       f.close()
while True:
           a()

Tan sólo hay que decirle la ip y un rango de puertos a probar, y además crea un fichero con toda la información del escaneo, en este programa se usan sockets, el try-except, el tratamiendo de ficheros.... si entendéis este código, vais muy bien, si no, volved a repasar los tutoriales anteriores.

Bueno chic@s, espero que os haya gustado el tutorial de hoy, este tema es super interesante y super útil así que leedlo detenidamente y para lo del chat servidor-cliente, ya sabéis que podéis hacer pruebas en localhost, no hace falta tener dos ordenadores, un abrazo a tod@s, y hasta el siguente post.

2 comentarios:

Anónimo dijo...

el unico codigo que me funciono, gracias

Anónimo dijo...

chere tu post men...