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
Conectando ao MySQL com Python
Juliana Mascarenhas
Data Scientist and Master in Computer Modeling by LNCC.
Computer Engineer