paint-brush
Crear una sala de chat basada en la línea de comandos usando Pythonpor@yashhhhraj
16,989 lecturas
16,989 lecturas

Crear una sala de chat basada en la línea de comandos usando Python

por Yashraj Singh Chouhan8m2020/07/07
Read on Terminal Reader
Read this story w/o Javascript

Demasiado Largo; Para Leer

Python es uno de los lenguajes de programación más versátiles y uno puede observarlo a través de sus diversas aplicaciones en todas partes. En este tutorial, vamos a crear una sala de chat grupal que pueda albergar más de dos clientes a la vez. La arquitectura servidor-cliente significa que varios clientes estarán alojados en un servidor. Importaremos dos bibliotecas llamadas 'socket' y 'threading'. Ambas son bibliotecas integradas, por lo que no es necesario instalarlas. Necesitamos escribir dos scripts, uno para el lado del servidor y otro para el lado del cliente.

Company Mentioned

Mention Thumbnail
featured image - Crear una sala de chat basada en la línea de comandos usando Python
Yashraj Singh Chouhan HackerNoon profile picture

Sala de chat simple usando Python

Python es uno de los lenguajes de programación más versátiles y uno puede observarlo a través de sus diversas aplicaciones en todas partes. Aquí hay un ejemplo de cómo puede construir una sala de chat simple basada en la línea de comandos usando python, que es fácil de implementar y comprender. Entonces empecemos.

¿Qué es una sala de chat?

Una sala de chat es un medio/interfaz que permite que dos o más personas conversen y envíen mensajes a todos. Puede ser interpersonal (uno a uno) y chat grupal también. En este tutorial , vamos a crear una sala de chat grupal que pueda albergar más de dos clientes a la vez.

Arquitectura

Para la sala de chat, vamos a utilizar la arquitectura servidor-cliente. Significa que varios clientes estarán alojados en un servidor.

Empezando:

Antes de sumergirnos en el código, lo último que queremos saber es seguir esta arquitectura, necesitamos escribir dos scripts, uno para el lado del servidor y otro para el lado del cliente. Una cosa que debe quedar muy clara es que los clientes hablarán solo a través del servidor. No habrá comunicación directa entre ellos. Así que vamos a sumergirnos en el código.

Código del lado del servidor:

En primer lugar, importaremos dos bibliotecas llamadas 'socket' y 'threading'. Ambas son bibliotecas integradas, por lo que no es necesario instalarlas por pip. Solo la importación funcionará. La programación de sockets es una forma de conectar dos nodos en una red para comunicarse entre sí, mientras que el módulo de subprocesamiento proporciona una API muy simple e intuitiva para generar múltiples subprocesos en un programa. Luego pasaremos a definir nuestra IP y puerto. Uno debe saber que solo se pueden usar puertos no reservados, ya que esto funcionará en LocalHost y la computadora puede causar problemas si usa los reservados.

Al definir el socket, se utilizarán dos parámetros denominados (AF_INET) y (SOCK_STREAM). El primero indica el uso de conexión a Internet y el otro indica el uso de TCP. Luego pasamos a definir la función de transmisión. Su función básica es enviar mensajes a los clientes en la lista de clientes. Esta función aún no se retira. Vamos a usarlo más adelante en otros lugares también. Manejar a los clientes es un trabajo bastante duro, al igual que la función. Primero intenta si se puede recibir un mensaje desde el extremo del cliente, si es así, se transmite.

Pero si hay algún tipo de error/problema, el servidor simplifica las cosas. Simplemente elimina el cliente. Hemos hecho mucho trabajo, pero aún falta agregar los clientes. Así que hagámoslo ahora. En la función de recepción, la palabra clave 'NICKNAME' se envía a los clientes, lo que significa que se solicita su apodo. Posteriormente al obtener el nickname, agrega al cliente a la lista.

Bueno, este bucle permanece activo y varios clientes pueden unirse al servidor. Todo lo que necesita para tener la IP correcta y la dirección del puerto.

Código:

 #Coded by Yashraj Singh Chouhan import socket, threading #Libraries import host = '127.0.0.1' #LocalHost port = 7976 #Choosing unreserved port server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #socket initialization server.bind((host, port)) #binding host and port to socket server.listen() clients = [] nicknames = [] def broadcast (message) : #broadcast function declaration for client in clients: client.send(message) def handle (client) : while True : try : #recieving valid messages from client message = client.recv( 1024 ) broadcast(message) except : #removing clients index = clients.index(client) clients.remove(client) client.close() nickname = nicknames[index] broadcast( '{} left!' .format(nickname).encode( 'ascii' )) nicknames.remove(nickname) break def receive () : #accepting multiple clients while True : client, address = server.accept() print( "Connected with {}" .format(str(address))) client.send( 'NICKNAME' .encode( 'ascii' )) nickname = client.recv( 1024 ).decode( 'ascii' ) nicknames.append(nickname) clients.append(client) print( "Nickname is {}" .format(nickname)) broadcast( "{} joined!" .format(nickname).encode( 'ascii' )) client.send( 'Connected to server!' .encode( 'ascii' )) thread = threading.Thread(target=handle, args=(client,)) thread.start() receive()

Código del lado del cliente:

Este es nuestro segundo código donde escribiremos el script para nuestros clientes. Este código será suficiente para conseguirnos múltiples clientes sin ningún problema. Así que comenzamos con la importación de sockets y subprocesos. Después de inicializar el socket, necesitamos conectarlo a la IP y al puerto. Deben ser iguales que el servidor para que funcione.

Ahora necesitamos conectarnos al servidor y si recuerdas 'NICKNAME' fue la palabra clave enviada por el servidor para solicitar un apodo, si el cliente recibe eso, envía el apodo e ingresa a la sala de chat. Pero si no recibe esa palabra clave, la conexión se pierde. Ahora que estamos conectados al servidor, ¿por qué estamos esperando? Comencemos a enviar mensajes.

Para ello contamos con la función de escritura que gestiona el envío de mensajes. Si se pregunta qué pasa con la recepción de mensajes, recuerde que importamos subprocesos. Aquí entra en juego, necesitamos dos hilos para empezar y listo.

Ha notado que hemos codificado los mensajes en ASCII antes de enviarlos, porque podemos enviar mensajes solo en forma de bytes y no en cadenas. Por eso recuerda siempre, codifica antes de enviar y decodifica después de recibir.

código:

 #Coded by Yashraj Singh Chouhan import socket, threading nickname = input( "Choose your nickname: " ) client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #socket initialization client.connect(( '127.0.0.1' , 7976 )) #connecting client to server def receive () : while True : #making valid connection try : message = client.recv( 1024 ).decode( 'ascii' ) if message == 'NICKNAME' : client.send(nickname.encode( 'ascii' )) else : print(message) except : #case on wrong ip/port details print( "An error occured!" ) client.close() break def write () : while True : #message layout message = '{}: {}' .format(nickname, input( '' )) client.send(message.encode( 'ascii' )) receive_thread = threading.Thread(target=receive) #receiving multiple messages receive_thread.start() write_thread = threading.Thread(target=write) #sending messages write_thread.start()

Pruebas en el mundo real:

Recuerde, el servidor se ejecutará primero, luego pueden unirse varios clientes. Esto se puede ejecutar en la línea de comandos, pero necesitamos diferentes terminales para ejecutarlos individualmente.

Bueno, eso es todo por este código, ¡espero que les haya gustado!