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 No tienes permitido ver los links. Registrarse o Entrar a mi cuenta 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 No tienes permitido ver los links. Registrarse o Entrar a mi cuenta 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