Al igual que en muchos lenguajes, Python nos proporciona un conjunto de clases y bibliotecas para realizar la conexión a equipos de forma remota a través de los denominados Socket.
Ellos nos permite enviar y recibir información entre aplicaciones utilizando el modelo de comunicación Cliente – Servidor.
Y eso es lo que vamos a intentar hacer en esta oportunidad. Desarrollar un cliente y un servidor para que se comuniquen entre ellos.
Comencemos:
Cliente
Creamos un archivo llamado Cliente.py y dentro de el ponemos:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
En estas primeras lineas estamos dando el interprete y la codificacion.
Importamos la libreria Socket
import socket
Creamos un objeto socket para el cliente
s = socket.socket()
Utilizamos el metodo connect para conectarnos al servidor
s.connect(("localhost", 9999))
El argumento de connect es una tupla con host y puerto.
Ya estamos conectados ahora hacemos un bucle que pide por consola el mensaje a enviar. Luego de introducido el mensaje se envia utilizando el metodo send.
while True:
mensaje = raw_input("> ")
s.send(mensaje)
if mensaje == "Quit":
break
Y ponemos un comando de salida que es la palabra clave Quit, que si se llega a introducir se sale del bucle y cerramos la coneccion.
s.close()
Servidor
Creamos un nuevo archivo llamado Servidor.py y dentro de el ponemos:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
Estas dos lineas las explicamos en el cliente.
Importamos la libreria Socket
import socket
Creamos un objeto socket para el servidor
s = socket.socket()
Tenemos ahora que indicar en qué puerto se va a mantener a la escucha nuestro servidor utilizando el método bind. Para sockets IP, como es nuestro caso, el argumento de bind es una tupla que contiene el host y el puerto.
s.bind(("localhost", 9999))
Utilizamos listen para hacer que el socket acepte conexiones y accept para comenzar a escuchar. listen requiere de un parámetro que indica el número de conexiones máximas que queremos aceptar; evidentemente, este valor debe ser al menos 1.
s.listen(1)
sc, addr = s.accept()
accept se mantiene a la espera de conexiones entrantes, bloqueando la ejecución hasta que llega un mensaje.
Cuando llega un mensaje, accept desbloquea la ejecución, devolviendo un objeto socket que representa la conexión del cliente y una tupla que contiene el host y puerto de dicha conexión.
Una vez que tenemos este objeto socket podemos comunicarnos con el cliente a través suyo, mediante los métodos recv y send que permiten recibir o enviar mensajes respectivamente. El método send toma como parámetros los datos a enviar, mientras que el método recv toma como parámetro el número máximo de bytes a aceptar.
Nuevamente haciendo uso de Un bucle podemos hacer que siga recibiendo los mensajes hasta que llegue la palabra clave de cierre, que es Quit.
while True:
recibido = sc.recv(1024)
if recibido == "quit":
break
print "Recibido:", recibido
sc.send(recibido)
Llegado este punto solo nos queda cerrar la coneccion.
sc.close()
s.close()
Codigos completo:
Cliente
import socket
s = socket.socket()
s.connect(("localhost", 9999))
while True:
mensaje = raw_input("> ")
s.send(mensaje)
if mensaje == "quit":
break
s.close()
Servidor
import socket
s = socket.socket()
s.bind(("localhost", 9999))
s.listen(1)
sc, addr = s.accept()
while True:
recibido = sc.recv(1024)
if recibido == "quit":
break
print "Recibido:", recibido
sc.send(recibido)
sc.close()
s.close()
Y probemoslo.
(http://i.imgur.com/GTB5g.png)
Creditos: Mundo geek
Saludos