domingo, 19 de noviembre de 2017

Sockets en Python - Chat local


La comunicación entre distintas entidades en una red se basa en Python en el clásico concepto de sockets. Los programas utilizan sockets para comunicarse con otros programas, que pueden estar situados en computadoras distintas. Los tipos y funciones necesarios para trabajar con sockets se encuentran en Python en el módulo socket , como no podría ser de otra forma.

Un socket queda definido por la dirección IP de la máquina, el puerto en el que escucha, y el protocolo que utiliza. Para el ejemplo de hoy he realizado un pequeño programa en Python para intercambiar mensajes al cual he llamado PyChatLocal en el cual podremos "mensajear" con otro ordenador que este en red local.

Creando un Socket [Servidor]

Para realizar nuestro ejemplo primero debemos crear un socket para lo que sera el servidor, que estara a la escucha de las conexiones.

Creamos un objeto socket:

escucha = socket.socket()

Con el metodo bind(()) indicaremos el puerto por la cual estará en la escucha, en este caso será el 1234 y el host podemos poner localhost o dejarlo vacío:

escucha.bind(('',1234))

Luego le indicaremos el numero de conexiones que pueden estar a la espera en nuestro socket servidor:

escucha.listen(3)

Para este ejemplo, la conexión se realizara entre 2 clientes, por lo cual lo he realizado así. Nuestro socket servidor acepta las conexiones de los 2 clientes que se comunicaran:

conn, addr = escucha.accept()

La funcion accept() nos retorna 2 variables, una es la conexion y otro es una tupla que contiene (direccion,puerto) del cliente que se ha conectado.


Por ultimo, se encarga de enviar los mensajes entre el cliente 1 y 2:

while True:
#Intercambio de mensajes entre clientes
recibido = conn.recv(1024)
conn2.send(addr[0]+">"+recibido)
recibido2 = conn2.recv(1024)
conn.send(addr2[0]+">"+recibido2)

Con la función send() enviara el mensaje al cliente que ha realizado esa conexión con nuestro socket servidor. Por ultimo cierras las conexiones con close() para liberarlas.

Creando un Socket [Cliente]

Una vez creado nuestro socket servidor, ahora crearemos nuestro socket cliente. He realizado 2 puesto que para realizar la prueba en uno tenia Python 2.7 y en la otra maquina tenia Python 3.5 ambos archivos estan el repositorio PyChatLocal.

El programa recibe como parámetro la direccion IP en el cual esta ejecutándose nuestro socket servidor. Con la función connect(()) le pasamos como parámetro la dirección IP y el puerto por el cual esta escuchando, en este caso 1234, veamos:

host = sys.argv[1]
try:
#Conectar
sock = socket.socket()
sock.connect((host,1234))

Luego enviamos el contenido del mensaje que obtenemos de entrada y leemos los datos si es que existe alguna entrada con sock.recv(1024) el cual recibe como parámetro la cantidad de bytes a leer:

while True:
#Intercambio de mensajes
mensaje = raw_input()
sock.send(mensaje+"\n")
data = sock.recv(1024)
print data

Por ultimo cerramos la conexion para liberarla y ya tenemos un sencillo programa para intercambiar mensajes, probablemente mas adelante lo mejore para una próxima publicación.

Para las pruebas lo hice desde una maquina Ubuntu como servidor, ademas un cliente y una maquina Windows como el otro cliente:


Enlaces:


No hay comentarios.:

Publicar un comentario