Faça o Seu Próprio Chat Utilizando Python Através de Sockets.
- #Python
Introdução:
Construir seu próprio sistema de conversa com Python pode ser uma tarefa interessante e educativa. Com frequência, utilizamos aplicativos populares como WhatsApp ou mensagens do Facebook, que, apesar de diferentes, compartilham uma tecnologia comum para implementar sistemas interativos de conversa: os sockets de rede.
Os sockets de rede são essencialmente uma Interface de Programação de Aplicativos (API) que facilita a comunicação entre processos em dispositivos distintos por meio de uma rede.
Tipos de Sockets:
Socket TCP:
Este tipo de socket faz a utilização do protocolo TCP como meio de comunicação entre cliente e servidor, logicamente este tipo de socket é utilizado para projeto que exija mais segurança na hora de trafegar dados pela rede.
Socket UDP:
Já este tipo de socket tem como característica essencial, um atributo que pode parecer esquisito para os iniciantes no tema - a falta de confiabilidade.
Isso significa que, através da utilização desse protocolo, pode-se enviar datagramas de uma máquina à outra, mas sem garantia de que os dados enviados chegarão intactos e na ordem correta.
Exemplo pratico:
Vamos explorar exemplos práticos usando a linguagem Python devido à sua praticidade e acessibilidade. Neste tutorial, concentraremos principalmente no uso de sockets TCP, que é comumente preferido para a maioria dos projetos.
Arquitetura do Projeto:
Antes de começarmos a programar, é crucial entender que uma conexão requer, pelo menos, dois dispositivos: um que envia mensagens (cliente) e outro que as recebe (servidor). Pode haver vários clientes para um único servidor.
Servidor:
A seguir, apresentamos um código explicativo que detalha o significado de cada função. Para aprofundamento adicional, recomendamos consultar a documentação oficial do Python: Documentação Oficial do Python.
import threading
import socket
# Lista de clientes conectados ao servidor
clients = []
# Função para lidar com as mensagens de um cliente
def handle_client(client):
while True:
try:
msg = client.recv(2048)
broadcast(msg, client)
except:
remove_client(client)
break
# Função para transmitir mensagens para todos os clientes
def broadcast(msg, sender):
for client in clients:
if client != sender:
try:
client.send(msg)
except:
remove_client(client)
# Função para remover um cliente da lista
def remove_client(client):
clients.remove(client)
# Função principal
def main():
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print("Iniciou o servidor de bate-papo")
try:
server.bind(("localhost", 7777))
server.listen()
except:
return print('\nNão foi possível iniciar o servidor!\n')
while True:
client, addr = server.accept()
clients.append(client)
print(f'Cliente conectado com sucesso. IP: {addr}')
# Inicia uma nova thread para lidar com as mensagens do cliente
thread = threading.Thread(target=handle_client, args=(client,))
thread.start()
# Executa o programa
main()
Cliente:
Agora, com nosso código do servidor pronto, elaboraremos um algoritmo para permitir que o cliente se comunique com outros dispositivos.
import threading
import socket
def main():
# Cria um objeto de soquete para o cliente
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
# Tenta se conectar ao servidor na porta 7777
client.connect(('localhost', 7777))
except:
# Se não conseguir se conectar, exibe uma mensagem e encerra o programa
return print('\nNão foi possível se conectar ao servidor!\n')
# Solicita ao usuário inserir um nome de usuário
username = input('Usuário> ')
print('\nConectado')
# Cria duas threads para lidar com a recepção e envio de mensagens simultaneamente
thread1 = threading.Thread(target=receiveMessages, args=[client])
thread2 = threading.Thread(target=sendMessages, args=[client, username])
# Inicia as threads
thread1.start()
thread2.start()
def receiveMessages(client):
# Loop para receber mensagens do servidor
while True:
try:
# Recebe uma mensagem codificada em UTF-8 e a decodifica
msg = client.recv(2048).decode('utf-8')
# Exibe a mensagem recebida
print(msg+'\n')
except:
# Se houver um erro ao receber mensagens, exibe uma mensagem e encerra a conexão
print('\nNão foi possível permanecer conectado no servidor!\n')
print('Pressione <Enter> Para continuar...')
client.close()
break
def sendMessages(client, username):
# Loop para enviar mensagens para o servidor
while True:
try:
# Solicita ao usuário inserir uma mensagem
msg = input('\n')
# Envia a mensagem formatada com o nome de usuário ao servidor
client.send(f'<{username}> {msg}'.encode('utf-8'))
except:
# Se houver um erro ao enviar mensagens, encerra a thread
return
# Chama a função main para iniciar o cliente
main()
Conclusão:
Este tutorial não apenas oferece um ponto de partida para desenvolvedores iniciantes, mas também incentiva uma compreensão mais profunda das tecnologias subjacentes. Aproveite a jornada de construir suas próprias soluções de comunicação utilizando Python e sockets de rede.
Agradecimentos:
Meu muito obrigado a todos vocês que chegaram até aqui, e espero ter ajudado vocês até aqui.
Fontes:
https://docs.python.org/3/library/socket.html
https://www.alura.com.br/artigos/entendendo-socket-no-python-criando-um-bot-de-irc