image

Acesse bootcamps ilimitados e +650 cursos

50
%OFF
Article image

LS

Lucas Souza27/12/2023 15:41
Compartilhe

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

Compartilhe
Recomendados para você
Suzano - Python Developer
BairesDev - Machine Learning Practitioner
Santander - Cibersegurança #2
Comentários (0)