Compreendendo Sockets Python e Comunicação Básica
Vamos começar entendendo o que são sockets e como eles funcionam em Python.
O que é um Socket?
Um socket é um ponto final para enviar e receber dados através de uma rede. Pense nele como um ponto de conexão virtual através do qual flui a comunicação de rede. O módulo socket embutido do Python fornece as ferramentas para criar, configurar e usar sockets para comunicação de rede.
Fluxo Básico de Comunicação Socket
A comunicação socket normalmente segue estes passos:
- Criar um objeto socket
- Vincular o socket a um endereço (para servidores)
- Escutar por conexões de entrada (para servidores)
- Aceitar conexões (para servidores) ou conectar-se a um servidor (para clientes)
- Enviar e receber dados
- Fechar o socket quando terminar
Vamos criar nosso primeiro programa socket simples para entender melhor esses conceitos.
Criando Seu Primeiro Servidor Socket
Primeiro, vamos criar um servidor socket básico que escuta por conexões e ecoa de volta quaisquer dados que recebe.
Abra o WebIDE e crie um novo arquivo chamado server.py no diretório /home/labex/project com o seguinte conteúdo:
import socket
## Define server address and port
HOST = '127.0.0.1' ## Standard loopback interface address (localhost)
PORT = 65432 ## Port to listen on (non-privileged ports are > 1023)
## Create a socket object
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print(f"Socket created successfully")
## Bind the socket to the specified address and port
server_socket.bind((HOST, PORT))
print(f"Socket bound to {HOST}:{PORT}")
## Listen for incoming connections
server_socket.listen(1)
print(f"Socket is listening for connections")
## Accept a connection
print(f"Waiting for a connection...")
connection, client_address = server_socket.accept()
print(f"Connected to client: {client_address}")
## Receive and echo data
try:
while True:
## Receive data from the client
data = connection.recv(1024)
if not data:
## If no data is received, the client has disconnected
print(f"Client disconnected")
break
print(f"Received: {data.decode('utf-8')}")
## Echo the data back to the client
connection.sendall(data)
print(f"Sent: {data.decode('utf-8')}")
finally:
## Clean up the connection
connection.close()
server_socket.close()
print(f"Socket closed")
Criando Seu Primeiro Cliente Socket
Agora, vamos criar um cliente para se conectar ao nosso servidor. Crie um novo arquivo chamado client.py no mesmo diretório com o seguinte conteúdo:
import socket
## Define server address and port
HOST = '127.0.0.1' ## The server's hostname or IP address
PORT = 65432 ## The port used by the server
## Create a socket object
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print(f"Socket created successfully")
## Connect to the server
client_socket.connect((HOST, PORT))
print(f"Connected to server at {HOST}:{PORT}")
## Send and receive data
try:
## Send data to the server
message = "Hello, Server!"
client_socket.sendall(message.encode('utf-8'))
print(f"Sent: {message}")
## Receive data from the server
data = client_socket.recv(1024)
print(f"Received: {data.decode('utf-8')}")
finally:
## Clean up the connection
client_socket.close()
print(f"Socket closed")
Testando Seus Programas Socket
Agora, vamos testar nossos programas socket. Abra duas janelas de terminal na VM LabEx.
No primeiro terminal, execute o servidor:
cd ~/project
python3 server.py
Você deve ver uma saída semelhante a:
Socket created successfully
Socket bound to 127.0.0.1:65432
Socket is listening for connections
Waiting for a connection...
Mantenha o servidor em execução e abra um segundo terminal para executar o cliente:
cd ~/project
python3 client.py
Você deve ver uma saída semelhante a:
Socket created successfully
Connected to server at 127.0.0.1:65432
Sent: Hello, Server!
Received: Hello, Server!
Socket closed
E no terminal do servidor, você deve ver:
Connected to client: ('127.0.0.1', XXXXX)
Received: Hello, Server!
Sent: Hello, Server!
Client disconnected
Socket closed
Parabéns! Você acabou de criar e testar sua primeira aplicação cliente-servidor baseada em socket em Python. Isso fornece a base para entender como a comunicação socket funciona e como implementar o tratamento de erros nos próximos passos.