Article image

LS

Lucas Souza27/12/2023 15:41
Compartilhe

Faça o Seu Próprio Chat Utilizando Python Através de Sockets.

    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

    Compartilhe
    Comentários (0)