Socket em Python criando chat UDP

Tutorial para a criação de um chat simples utilizando sockets em UDP em Python 3. O objetivo é criar a comunicação unidirecional, onde um cliente envia mensagens para um servidor.

Aprender a usar sockets em python é uma ótima forma de combinar os conhecimentos de programação e redes.

Criando o chat em UDP

Primeiramente vamos mostrar como criar um chat usando o UDP. O legal do UDP é sua simplicidade e velocidade para transmitir informações.

No entanto, o UDP não trata erros e nem ordena os segmentos, isso pode levar a alguns erros em aplicações como chat e transferência de arquivos.

Se quiser criar um chat com socket TCP clique aqui.

Explicando o servidor do chat em UDP

Agora, vamos mostrar o código do servidor do chat em python. Depois, vamos mostrar como executar o código e posteriormente vamos explicar o código.

#!/usr/bin/python3
# server_UDP.py

import socket


# Request the port that the server should listen on
server_port = int(input("Enter the port the server should listen on: "))

server_ip = ''  # Server IP address; '' means it will listen on all interfaces

# Create the UDP socket
udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# Define the server address (IP and port)
server_address = (server_ip, server_port)
udp.bind(server_address)  # Bind the IP and port to start listening

print(f"Server listening on port {server_port}...")

try:
        while True:
            # Receive data from the client (data, address)
            received_message, client_address = udp.recvfrom(1024)
            # Decode the message from bytes to string
            received_message = received_message.decode("utf8")
            print(f"Received '{received_message}' from {client_address}")
except KeyboardInterrupt:
        print("\nServer shutting down.")
except Exception as e:
        print(f"An error occurred: {e}")
finally:
        udp.close()

Executando o servidor socket UDP no Windows

Agora vamos abrir um editor do Windows. Nesse caso, estamos usando o Notepad para colar o código que copiamos. Depois de colar o código acima, clique em “save as“.

Em seguida, vamos dar o nome “serverudp.py” e vamos clicar em salvar. Lembre-se do local onde você está salvando o arquivo.

Agora, vamos no local onde você salvou o arquivo “serverudp.py” e vamos dar um duplo click com o mouse para executa-lo. Depois de executar o “serverudp.py” vamos escolher a porta que o servidor vai ouvir.

Nesse caso, estamos fazendo o servidor ouvir na porta 4040.

Caso seja necessário, permita o acesso no Windows Defender Firewall. Nesse caso, você pode escolher entre acesso somente para rede privada ou acesso para redes públicas. Veja qual acesso atende melhor o seu laboratório de prática.

Executando o servidor socket UDP no Linux

Em uma máquina com o Linux, podemos abrir o terminal e digitar o comando abaixo. E depois cole o código do servidor que você copiou acima.

nano serverudp.py

Depois de colar o código e salvar, vamos executar o “server.py”. Para isso, vamos digitar o comando abaixo.

python3 serverudp.py

Podemos observar que o servidor está ouvindo na porta 4040 e aguardando conexões.

Explicando o código do servidor socket UDP

Agora vamos explicar o código do servidor socket UDP do nosso chat.

Inicialmente vamos perguntar qual vai ser a porta que o servidor vai ouvir. Minha sugestão é que utilize portas altas como por exemplo 4040.

# Request the port that the server should listen on
server_port = int(input(“Enter the port the server should listen on: “))
server_ip = ” # Server IP address; ” means it will listen on all interfaces

Depois vamos criar o socket UDP que será do tipo IPv4 =”AF_INET” e será UDP = “SOCK_DGRAM“.


# Create the UDP socket
udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

Agora, vamos configurar o IP e a porta que desejamos monitorar. Neste caso, estamos considerando que o IP será “0.0.0.0“, ou seja, o servidor ficará escutando na porta especificada em todos os IPs disponíveis na máquina.

Em seguida vamos armazenar dados da conexão em duas variáveis. A variável “server_ip” armazena o IP do cliente e a variável “server_port” apresenta a porta que o servidor vai ouvir.

# Define the server address (IP and port)
server_address = (server_ip, server_port)
udp.bind(server_address) # Bind the IP and port to start listening

Em seguida, vamos ver o loop que aguarda as mensagens recebidas que são colhidas com o socket.

  • recvfrom(1024) = lê até 1024 bytes da mensagem enviada pelo cliente através do socket.
  • received_message.decode(“utf8”) = decodificada de bytes para string a mensagem recebida;

while True:
# Receive data from the client (data, address)
received_message, client_address = udp.recvfrom(1024)
# Decode the message from bytes to string
received_message = received_message.decode(“utf8”)

Por último temos a finalização do socket quando o usuário pressiona “CTRL+c”.

udp.close()

Explicando o cliente do chat em UDP

Em seguida, vamos mostrar o código do cliente do chat em python e depois como executa-lo.

#!/usr/bin/python3
# client_UDP.py

import socket

def main():
    # Request the Server's IP and Port
    server_IP = input("Enter the server's IP address: ")
    server_port = int(input("Enter the server's port: "))

    # Create the UDP socket
    udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    # Define the destination (IP and port)
    DESTINATION = (server_IP, server_port)

    try:
        print("Type your messages. To exit, type 'exit'.")
        while True:
            # Get the user's message
            message = input("Enter the message to be sent: ")
            if message.lower() == 'exit':
                print("Closing the client.")
                break

            # Send the message to the destination
            udp.sendto(bytes(message, "utf8"), DESTINATION)
            print("Message sent successfully!")
    except Exception as e:
        print(f"Error during communication: {e}")
    finally:
        # Close the socket
        udp.close()

if __name__ == "__main__":
    main()

Executando o cliente socket UDP no Windows

Vamos abrir um editor como o Notepad e vamos colar o código que copiamos acima. Depois vamos clicar em salvar.

Nesse momento, vamos escolher o local onde vamos criar o arquivo e o nome. Nesse caso vamos usar o nome “clientudp.py“.

Agora, vamos até o diretório onde você salvou o “clientudp.py” e podemos dar um duplo click no client para executa-lo.

Ao executar o “clientudp.py” vamos indicar o IP do servidor. Nesse caso, estamos usando o endereço de loopback o “127.0.0.1” mas você pode escolher o IP de uma máquina da sua rede que esteja executando o “serverudp.py“.

Em seguida, vamos digitar a porta que o servidor está ouvindo, que nesse nosso exemplo foi a porta 4040.

Depois enviamos uma mensagem “hello“.

Podemos ver na figura acima que o servidor recebeu a mensagem “hello” que o cliente enviou.

Executando o cliente socket UDP no linux

Para executar o cliente no Linux, vamos abrir um terminal e usar um editor. Em nosso caso estamos usando o editor “nano”. Assim, vamos digitar o comando abaixo para criar e editar o arquivo “clientudp.py“.

nano clientudp.py

Depois de abrir o editor, vamos colar o código do cliente que copiamos acima e depois salvar.

Agora, vamos executar o “clientudp.py” usando o comando abaixo.

python3 clientudp.py

Ao executar o “clientudp.py” vamos indicar o IP do servidor. Nesse caso, estamos usando o endereço de loopback o “127.0.0.1” mas você pode escolher o IP de uma máquina da sua rede que esteja executando o “serverudp.py“.

Em seguida, vamos digitar a porta que o servidor está ouvindo, que nesse nosso exemplo foi a porta 4040.

Agora, vamos digitar “hello” no cliente.

Podemos perceber que o servidor “serverudp.py” recebeu o “hello” do cliente.

Explicando o código do cliente socket UDP

Inicialmente estamos pedindo que o usuário indique o IP e a porta que o cliente vai se conectar. Nesse caso, vamos inserir o IP do servidor e a porta que o servidor está ouvindo.

# Request the Server’s IP and Port
server_IP = input(“Enter the server’s IP address: “)
server_port = int(input(“Enter the server’s port: “))

Agora, vamos criar o socket UDP.

# Create the UDP socket
udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

A primeira linha cria um socket para comunicação entre cliente e servidor usando:

  • AF_INET = IPv4 como família de endereços.
  • SOCK_DGRAM = UDP como protocolo de comunicação, o que significa que a comunicação não será orientada a conexão, não será confiável, e sem controle de fluxo.

Em seguida, vamos criar a variável que vai ser usada como o destino da comunicação UDP. Nesse caso temos a combinação do IP e porta do servidor.


# Define the destination (IP and port)
DESTINATION = (server_IP, server_port)

A seguir, vamos ver o trecho do código que permite ao usuário enviar várias mensagens ao servidor até que ele decida encerrar o programa.

# Get the user’s message
message = input(“Enter the message to be sent: “)

Em seguida, vamos para a função que vai conectar ao servidor “udp.sendto“. Essa função recebe como parâmetro o conjunto I(P + porta do servidor) que definimos anteriormente como “DESTINATION“.

# Send the message to the destination
udp.sendto(bytes(message, “utf8”), DESTINATION)

  • input() = Solicita ao usuário que digite uma mensagem.
  • udp.sendto() = função para enviar a mensagem.
  • bytes(Mensagem, “utf8”) = A mensagem é convertida para bytes para ser enviada pela rede.

Depois vamos ter a função para verificar se houve erro no socket “except Exception” e por fim, teremos a função para finalizar o socket com “udp.close()“.

except Exception as e:
print(f”Error during communication: {e}”)
finally:
# Close the socket
udp.close()

Leia mais:

Socket em Python, criando um Chat

Qual a melhor IDE para Python?

Python: como obter metadados de imagens e PDFs

Mesclando arquivos PDFs: REGEX e PyPDF2 com Python

Criando CRUD MySQL com Python

Conectando ao MySQL com Python

Juliana Mascarenhas

Data Scientist and Master in Computer Modeling by LNCC.
Computer Engineer