Utilizando Socket en Python

Iniciado por Expermicid, Enero 17, 2013, 02:16:40 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

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 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login y dentro de el ponemos:

Código: python
#!/usr/bin/env python
# -*- coding: utf-8 -*-


En estas primeras lineas estamos dando el interprete y la codificacion.

Importamos la libreria Socket

Código: python
import socket


Creamos un objeto socket para el cliente

Código: python
s = socket.socket()


Utilizamos el metodo connect para conectarnos al servidor

Código: python
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.

Código: python
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.

Código: python
s.close()


Servidor

Creamos un nuevo archivo llamado You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login y dentro de el ponemos:

Código: python
#!/usr/bin/env python
# -*- coding: utf-8 -*-


Estas dos lineas las explicamos en el cliente.

Importamos la libreria Socket

Código: python
import socket


Creamos un objeto socket para el servidor

Código: python
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.

Código: python
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.

Código: python
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.

Código: python
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.

Código: python
sc.close()  
s.close()





Codigos completo:

Cliente

Código: python
import socket  
 
s = socket.socket()   
s.connect(("localhost", 9999)) 
 
while True: 
      mensaje = raw_input("> ") 
      s.send(mensaje) 
      if mensaje == "quit": 
         break 
 
s.close()


Servidor

Código: python
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.



Creditos: Mundo geek

Saludos