20
Sockets en Python Bautista Neri Alejandro Corona Falcon Juan Gonzalez Castillo Ignacio Quiroz Martinez Ezequiel

Sockets en Python Gonzalez Castillo Ignacio Quiroz ...profesores.fi-b.unam.mx/yasmine/expo/Sockets_Phyton.pdf · Otro objetivo del diseño del lenguaje es la facilidad de extensión

Embed Size (px)

Citation preview

Sockets en Python

Bautista Neri Alejandro

Corona Falcon Juan

Gonzalez Castillo Ignacio

Quiroz Martinez Ezequiel

Python alcanzó la versión 1.0 en enero de 1994. Una característica de este lanzamiento fueron las herramientas de la programación funcional: lambda, map, filter y reduce.

La última versión liberada fue Python 1.2. En 1995

Durante su estancia en CNRI, van Rossum lanzó la iniciativa ComputerProgramming for Everybody, con el fin de hacer la programación más accesible, con un nivel de 'alfabetización' básico en lenguajes de programación, similar a la alfabetización básica en inglés y habilidades matemáticas indispensables para los trabajadores.

Python tuvo un papel crucial en este proceso: debido a su orientación hacia una sintaxis limpia, presentaban similitudes con su predecesor, ABC.

Python 2.0 tomó una característica del lenguaje de programación Haskell: listcomprehensions. Python tiene una sintaxis muy similar a la de Haskell, salvo por la preferencia de los caracteres de puntuación en Haskell.

Python 2.0 introdujo además un sistema de recolección de basura capaz de recolectar referencias cíclicas.

Python License, incluía una cláusula estipulando que estaba gobernada por el

estado de Virginia, bajo la óptica de los abogados de Free Software Foundation

(FSF), se hacía incompatible con GNU GPL. CNRI y FSF se relacionaron para

cambiarla a software libre de Python y hacerla compatible con GPL.

En Python 2.2 fue la unificación de los tipos en Python (tipos escritos en C), y

clases (tipos escritos en Python) dentro de una jerarquía. Esa unificación logró un

modelo de objetos de Python puro y consistente. También se agregaron

generadores para el lenguaje Icon.

Las adiciones a la biblioteca estándar de Python y las decisiones sintácticas

fueron influenciadas fuertemente por Java en algunos casos: el package logging,

en la versión 2.3, el parser SAX, en 2.0, y la sintaxis del patrón decorator que usa

el @, agregado en la versión 2.4.

Características

Se compara habitualmente con Tcl, Perl, Scheme, Java y Ruby. En la actualidad

Python se desarrolla como un proyecto de código abierto, administrado por la

Python Software Foundation. La última versión estable del lenguaje es 3.1.

Python permite dividir el programa en módulos reutilizables desde otros

programas Python. Viene con una gran colección de módulos estándar que se

pueden utilizar como base a los programas. También hay módulos incluidos que

proporcionan E/S de ficheros, llamadas al sistema, sockets y hasta interfaces a

GUI (interfaz gráfica con el usuario) como Tk, GTK, Qt entre otros.

Python se utiliza como lenguaje de programación interpretado, ahorrando un

tiempo considerable en el desarrollo del programa, no es necesario compilar ni

enlazar. El intérprete se puede utilizar de modo interactivo, lo que facilita

experimentar las características del lenguaje.

Otro objetivo del diseño del lenguaje es la facilidad de extensión. Nuevos módulos

se pueden escribir fácilmente en C o C++. Python puede utilizarse como un

lenguaje de extensión para módulos y aplicaciones que necesitan de una interfaz

programable.

Los sockets son las tuberías de plomo de las redes computacionales que le permiten conectarse con otros dispositivos para que la información fluya libremente.

Como es de esperar, son ampliamente utilizados en Internet.

Los programas utilizan sockets para comunicarse con otros programas, que pueden estar situados en

computadoras distintas.

Un socket queda definido por la dirección IP de la máquina, el puerto en el que escucha, y el protocolo

que utiliza.

Los sockets se clasifican en sockets de flujo (socket.SOCK_STREAM)

Los sockets de datagramas (socket.SOCK_DGRAM)

Dependiendo de si el servicio utiliza TCP, que esorientado a conexión y fiable, o UDP, respectivamente.

a) El dominio de UNIX. (AF_UNIX)

b) El dominio de internet. (AF_INET)

c) El dominio NS.

Se utiliza para la comunicación entre procesos del sistema.

El dominio de internet. (AF_INET)

Se utiliza en procesos que se están comunicando a través de TCP(UDP)/IP.

Se utilizaba sobre los procesos que se comunicaban sobre el protocolo de comunicación de Xerox.

Python solo soporta los dos primeros tipos de comunicación.

Socket Descripcion

socketCrea un socket del tipo y familia

especificada.

socket.accept Acepta nuevas conexiones.

socket.connectConecta el socket a la dirección dada en el

puerto dado.

socket.send Envia datos al socket especificado.

socket.recv Recive información.

Lo primero que se hace es crear un objeto socket para el servidor

#constructor socket.socket()

#e indicamos el puerto de escucha utilizando método bind

socket_s=socket.socket( )

socket_s.bind((“Local host”, 9999))

Por último utilizamos listen para hacer que el socket acepte conexiones entrantes y accept para comenzar a escuchar.

El método accept se mantiene a la espera de conexiones entrantes, bloqueando la ejecución hasta que llega un mensaje.

#el argumento de listen es el numero de clientes

socket_s.listen(10)

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.

#representa a la conexión

socket_c, (host_c, puerto_c)=socket_s.accept( )

Una vez que tenemos este objeto socket podemos comunicarnos con el cliente a través suyo, mediante los métodos recv y send (o recvfrom y sendfrom en UDP) que permiten recibir o enviar mensajes respectivamente.

#send(datos) recv (bytes)

recibido=socket_c.recv(1024)

print “Recibido: ”, recibio

socket_c.send(recibido)

#posterirmente se cierra

Crear un cliente es aún más sencillo. Sólo tenemos que crear el objeto socket, utilizar el método connect para conectarnos al servidor y utilizar los métodos send y recv. El argumento de connect es una tupla con host y puerto, exactamente igual que bind.

socket_c=socket.socket( )

socket_c.connect((“localhost”, 9999))

socket_c.send(“hola”)

#El cliente manda al servidor cualquier mensaje que escriba el usuario y #el servidor no hace más que repetir el mensaje recibido. La ejecución #termina cuando el usuario escribe quit#en el lado del servidorimport sockets=socket.socket()s.bind((“Localhost”, 9999))s.listen(1)sc, addr=s.accept( )while True:

recibido=sc.recv(1024)if recibido==”quit”

breakprint “Recibido: ”, recibidosc.send(recibido)

print “adios”sc.close()s.close()

#en el lado del cliente

import socket

c=socket.socket

c.connect((“Localhost”, 9999))

Conclusiones Su sintaxis simple, clara y sencilla.

Interfaz dinámico.

Gestor de memoria.

Gran cantidad de librerías disponibles y la potencia del lenguaje.

Hacen que desarrollar una aplicación en Python sea sencillo, muy rápido.

La sintaxis es sencilla y cercana al lenguaje natural

Conclusiones Algunos ejemplos en el uso de Python son:

Google,

Yahoo,

NASA,

Industrias Light & Magic,

Distribuciones LINUX,

No es adecuado para la programación de bajo nivel o para aplicaciones en las que el rendimiento sea crítico.