(https://cdn2.iconfinder.com/data/icons/social-hand-drawn-icons/64/social_38-512.png)
UnderCh4t
Comenzamos la segunda entrega de este mini tutorial: creando nuestro propio chat con Python. El mío se llama UnderCh4t y si es la primera vez que escuchás hablar de él, te invito a que pases por aquí (https://underc0de.org/foro/python/(python)-underch4t-v1-0-(parte-1)/) y lo conozcas ;)
INTERFAZ DE CONEXIÓN
Hasta ahora no hemos hecho mucho: sólo creamos la estructura general de nuestro servidor (que, como veremos a lo largo del curso, irá sufriendo algunas modificaciones) y hemos desarrollado el método que nos permite crear el socket que vamos a utilizar para interactuar con nuestros clientes.
Si nos basamos en el método ejecutar (método guía del programa), ahora le toca el turno al método
bind. Veamos primero su código:
def _bind(self):
msj = "Estableciendo interfaz de conexión ({0}:{1})"
self._mostrar_info(msj.format(self.__ip, self.__puerto))
try:
self.__servidor.bind((self.__ip, self.__puerto))
except Exception as e:
self._mostrar_error(e, critico=True)
Nuevamente, dejando de lado los logs y el manejo de errores, lo único que nos interesa en este método es la siguiente línea:
self.__servidor.bind((self.__ip, self.__puerto))
Como siempre, lo primero que haremos será pegarle una ojeada a la documentación oficial (https://docs.python.org/2/library/socket.html#socket.socket.bind). En ella, podemos ver que el método bind tiene como objetivo establecer una interfaz de conexión, es decir, enlazar el socket a una dirección, la cual variará según la familia de dirección que utilicemos.
CitarEsto ya lo vimos en la primera parte pero para los que todavía no saben de qué estamos hablando, vamos con un rápido repaso. Cuando creamos un socket, debemos indicar cómo queremos que sea, es decir, qué familia, tipo y protocolo queremos que utilice. Dentro de las familias de sockets, las más utilizadas son:
- AF_INET (IPv4)
- AF_INET (IPv6)
- AF_UNIX (utilizada para comunicación entre procesos en una misma computadora).
Entonces, cuando creamos un socket, se le asigna una familia de direcciones pero no una dirección en particular. Para esto, debemos llamar al método
bind, pasándole como argumento la dirección que queremos asignar al socket.
Como dijimos antes, cada familia de sockets tiene su forma de indicar esta dirección. La familia AF_INET, por ejemplo, utiliza una tupla con dos valores: host (dominio o dirección IP) y puerto. El código quedaría así:
import socket
mi_socket = socket.socket(AF_INET, SOCK_STREAM)
direccion = ("127.0.0.1", 8000)
mi_socket.bind(direccion)
En este caso, primero creamos el socket - indicamos familia y tipo de socket (al protocolo, no indicado, lo determina el sistema)- y luego vinculamos el socket a una dirección. La dirección es una tupla que contiene una dirección IP (127.0.0.1) y un puerto (8000).
Con respecto a las direcciones de las otras familias, debido a que se escapa a los objetivos de este tutorial, no vamos a decir mucho; simplemente que la familia AF_UNIX utiliza una cadena para indicar la dirección, mientras que la familia AF_INET6 requiere una tupla con cuatro valores: host, puerto, flujo de información e identificador de ámbito. No se preocupen que esto no es algo que tengan que saber para este curso. Sin embargo, si alguno tiene ganas de aprender más del asunto, aquí dejo algunos links de interés: AF_UNIX (http://man7.org/linux/man-pages/man7/unix.7.html) y IPv6 (http://man7.org/linux/man-pages/man7/ipv6.7.html).
Bueno, esto es todo por ahora. Originalmente, mi idea era hacer una segunda parte más extensa pero, considerando que lo que viene es un poco más complejo, decidí hacer una entrega más corta que no los complique y les permita entender estos nuevos conceptos sin dificultad.
Vayan leyendo y repasando estas dos primeras partes que les van a servir de base para la entrega que viene. ;)
Saludos!
WhiZ
No tienes permitido ver enlaces.
Registrate o Entra a tu cuentaSe te escapó un (
msj = "Estableciendo interfaz de conexión ({0}:{1})")
Se aprende mucho con estos post, se agradece WhiZ :D
Saludos!
Gracias @Barlan por el aviso. En realidad me lo traje de la llamada al método mostrar_info. Al principio, lo puse así:
self._mostrar_info("Estableciendo interfaz de conexión ({0}:{1})".format(self.__ip, self.__puerto))
Como quedaba muy largo, metí el mensaje en una variable y ahí fue cuando me llevé el paréntesis de cierre jeje.
Como dije, muchas gracias por la notificación. En instantes lo modifico.
No tienes permitido ver enlaces.
Registrate o Entra a tu cuenta
Genial @WhiZ (https://underc0de.org/foro/index.php?action=profile;u=21214) he estado leyendo mucho sobre este fabuloso modulo y esto me cae como anillo al dedo, enserio GRACIAS
No, al contrario. Gracias a vos por tomarte el tiempo de pasar por aquí ;)
Saludos!
WhiZ
Genial. Me dejó con ganas esta entrada. A la espera de la siguiente.
Gracias por el aporte.