Python R2


Socket en Python

Posted in Python por Arturo Elias Antón en 3 septiembre 2008
Tags: , , , ,

¿Que es un socket?
Según Beej un socket es:

“Una forma de comunicarse con otros programas usando descriptores de fichero estándar de Unix..”[Guía Beej de Programación en Redes por Brian “Beej” Hall Link]

La programación de sockets se diferencia de la programación de aplicación tradicional, en que trabajamos con procesos que funcionan concurrentemente. Los socket enlazan procesos asincrónicos con un solo canal bidireccional.

En esta entrada solamente hablaremos de los sockets de dominio de internet, los de la familia AF_INET, existen otras familias de socket como las AF_UNIX, AF_FILE, AF_IPX, AF_AX25, etc., pero esos no serán tratados en esta entrada.

Los tipos de socket son

  • SOCK_STREAM: Este protocolo nos da una comunicación fiable de dos direcciones en un flujo de datos(TCP)
  • SOCK_DGRAM: Este protocolo nos da una conexión no fiable. (UDP)
  • SOCK_RAW: este protocolo es para acceder a los campos e interfaces internos de la red.
  • SOCK_RDM: Este protocolo garantiza el la llegada de paquetes pero no garantiza el orden de llegada
  • SOCK_SEQPACKET: datagramas fiables y secundarios, de longitud fija, basado en la conexión.
  • SOCK_PACKET Coloca el socket en modo promiscuo en la que recibe todos los paquetes de la red.

Para el parámetro type nosotros solo trataremos el del tipo SOCK_STREAM.

Métodos del Socket

Los métodos más importantes del socket son:

  • socket.socket: Crea un canal bidireccional con el que generalmente se establece una conexión de red
  • socket.bind: Define un puerto y un nombre para un socket.
  • socket.listen: Convierte el socket en un socket en escucha
  • socket.accept: Espera que llegue una conexión. Al llegar la descripción devuelve un socket nuevo para dicha conexión especifica
  • socket.connect: Conecta un socket con otro que lo este esperando en un puerto y dirección especifica
  • socket.send: Es por el método que enviaremos los mensajes
  • socket.recv: Es por el método que recibiremos los mensajes
  • socket.close: Cierra el socket.

Pasos para la creación de un programa que utiliza Socket

Los sockets, primero que nada necesitan un proceso que sea  servidor. Un servidor genérico realiza las siguientes tareas:

  • Crea un socket mediante socket.socket(famili,tipo)
  • Asocia el puerto por medio del método bind()
  • Pasa al socket a modo esperas mediante el método listen()
  • Espera una conexión con el método accept()
  • Lee o escribe los mensajes por medio del método recv() o send()
  • Al termino de la conexión se realiza con el método close()

Un ejemplo de un servidor simple es:

#!/usr/bin/python
# Nombre de Fichero : servidor.py

import socket

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(("", 8000))
server.listen(10)
while 1:
    add, port = server.accept()
    add.send("Usted se conecte al servidor")

Observemos que el parámetro de bind es una tupla.
El servidor que simplemente nos deja conectarnos y nos envía la cadena “Usted se a conectado al servidor” por medio del método send.

Los sockets tienen también otros procesos denominados cliente, lo que realizan estos son:

  • Crea un socket
  • Conectarse a una dirección y puerto de destino por medio del método connect()
  • Lee o escribe los mensajes por medio del método recv() o send()
  • Al termino de la conexión se realiza con el método close()

Un ejemplo de un cliente simple es:

#!/usr/bin/python
# Nombre de Fichero : servidor.py

#!/usr/bin/python
# Nombre de Fichero: cliente.py

import socket

cliente = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
cliente.connect(("127.0.0.1", 8000))
print cliente.recv(255)
cliente.close()

Observemos  que el parámetro de connect es una tupla

Enviando y recibiendo datos

Los métodos de un socket para enviar y recibir mensajes son iguales para el servidor que para el cliente.  Estos métodos ya vistos en los dos ejemplos anteriores son.

•    recv: Recibe la cantidad del largo del buffer a recibir
•    send: Envía por parámetro el dato a enviar

Observemos en este servidor que imprime todos los datos que llega

#!/usr/bin/python
# Nombre de Fichero : servidor.py

#!/usr/bin/python
# Nombre de Fichero: servidoMuestraTodo.py
import socket

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(("", 8002))
server.listen(10)
while 1:
    add, port = server.accept()
    print add.recv(255)
    add.close()

La salida de este programa, si nos conectamos a el por medio de un browser como puede ser firefox, será parecida a esta

>>>
GET / HTTP/1.1
Host: 127.0.0.1:8002
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: es-es,es;q=0.8,en-us;q=

Bien analizando esto podremos ver que el navegador no solicita con el comando GET la pagina que tenemos en el raíz y nos envía mucha mas información como el sistema operativo en el que esta trabajando.

Anuncios

Una respuesta to 'Socket en Python'

Subscribe to comments with RSS o TrackBack to 'Socket en Python'.

  1. SOM8R4 said,

    Muchas gracias. justo estaba yo buscando exactamente la informacion que esta aqui. 🙂


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s


A %d blogueros les gusta esto: