**Bom dia, aprendizes!** Em nosso tutorial anterior, discutimos sobre o módulo Python unittest. Hoje, vamos explorar um exemplo de programação de socket em Python. Criaremos aplicações de servidor e cliente de socket em Python.
Programação de Socket em Python
Para entender a programação de socket em Python, precisamos conhecer três tópicos interessantes – Servidor de Socket, Cliente de Socket e Socket. Então, o que é um servidor? Bem, um servidor é um software que aguarda solicitações de clientes e as atende ou as processa conforme necessário. Por outro lado, um cliente é o solicitante desse serviço. Um programa cliente solicita recursos ao servidor e o servidor responde a essa solicitação. O socket é o ponto final de um canal de comunicação bidirecional entre o servidor e o cliente. Os sockets podem comunicar-se dentro de um processo, entre processos na mesma máquina ou entre processos em máquinas diferentes. Para qualquer comunicação com um programa remoto, precisamos nos conectar por meio de uma porta de soquete. O principal objetivo deste tutorial de programação de socket é introduzir como o servidor e o cliente de socket se comunicam entre si. Você também aprenderá como escrever um programa de servidor de socket em Python.
Exemplo de Socket em Python
Como mencionado anteriormente, um cliente de soquete solicita recursos ao servidor de soquete e o servidor responde a essa solicitação. Portanto, vamos projetar modelos de servidor e cliente para que cada um possa se comunicar com o outro. Os passos podem ser considerados da seguinte forma.
- O programa do servidor de soquete em Python é executado primeiro e espera por qualquer solicitação.
- O programa do cliente de soquete em Python iniciará a conversa primeiro.
- Em seguida, o programa do servidor responderá de acordo com as solicitações do cliente.
- O programa do cliente será encerrado se o usuário digitar a mensagem “bye”. O programa do servidor também será encerrado quando o programa do cliente terminar, isso é opcional e podemos manter o programa do servidor em execução indefinidamente ou encerrá-lo com algum comando específico na solicitação do cliente.
Servidor de Soquete em Python
Vamos salvar o programa do servidor de socket Python como socket_server.py
. Para usar a conexão de socket Python, precisamos importar o módulo socket. Em seguida, sequencialmente, precisamos realizar algumas tarefas para estabelecer a conexão entre servidor e cliente. Podemos obter o endereço do host usando a função socket.gethostname()
. É recomendado usar um endereço de porta acima de 1024 porque os números de porta inferiores a 1024 são reservados para o protocolo de internet padrão. Veja o exemplo de código do servidor de socket Python abaixo, os comentários ajudarão você a entender o código.
import socket
def server_program():
# obtenha o nome do host
host = socket.gethostname()
port = 5000 # initiate port no above 1024
server_socket = socket.socket() # get instance
# observe de perto. A função bind() recebe uma tupla como argumento
server_socket.bind((host, port)) # bind host address and port together
# configure quantos clientes o servidor pode ouvir simultaneamente
server_socket.listen(2)
conn, address = server_socket.accept() # accept new connection
print("Connection from: " + str(address))
while True:
# receba o fluxo de dados. Não aceitará pacotes de dados maiores que 1024 bytes
data = conn.recv(1024).decode()
if not data:
# se os dados não forem recebidos, interrompa
break
print("from connected user: " + str(data))
data = input(' -> ')
conn.send(data.encode()) # send data to the client
conn.close() # close the connection
if __name__ == '__main__':
server_program()
Então, nosso servidor de socket Python está sendo executado na porta 5000 e ele esperará pela solicitação do cliente. Se você quiser que o servidor não pare quando a conexão do cliente for fechada, basta remover a condição if e a instrução de interrupção. O loop while Python é usado para executar o programa do servidor indefinidamente e continuar esperando pela solicitação do cliente.
Cliente de Socket Python
Vamos salvar o programa cliente de socket Python como socket_client.py
. Este programa é semelhante ao programa do servidor, exceto pela vinculação. A principal diferença entre o programa do servidor e do cliente é que, no programa do servidor, é necessário vincular o endereço do host e o endereço da porta juntos. Veja abaixo o exemplo de código do cliente de socket Python, o comentário ajudará você a entender o código.
import socket
def client_program():
host = socket.gethostname() # as both code is running on same pc
port = 5000 # socket server port number
client_socket = socket.socket() # instantiate
client_socket.connect((host, port)) # connect to the server
message = input(" -> ") # take input
while message.lower().strip() != 'bye':
client_socket.send(message.encode()) # send message
data = client_socket.recv(1024).decode() # receive response
print('Received from server: ' + data) # show in terminal
message = input(" -> ") # again take input
client_socket.close() # close the connection
if __name__ == '__main__':
client_program()
Saída da Programação de Socket em Python
Para ver a saída, primeiro execute o programa do servidor de socket. Em seguida, execute o programa do cliente de socket. Depois, escreva algo a partir do programa cliente. Em seguida, escreva novamente a resposta do programa do servidor. Por último, escreva bye a partir do programa cliente para encerrar ambos os programas. Abaixo, um vídeo curto mostrará como funcionou na minha execução de teste dos programas de exemplo de servidor e cliente de socket.
pankaj$ python3.6 socket_server.py
Connection from: ('127.0.0.1', 57822)
from connected user: Hi
-> Hello
from connected user: How are you?
-> Good
from connected user: Awesome!
-> Ok then, bye!
pankaj$
pankaj$ python3.6 socket_client.py
-> Hi
Received from server: Hello
-> How are you?
Received from server: Good
-> Awesome!
Received from server: Ok then, bye!
-> Bye
pankaj$
Observe que o servidor de socket está sendo executado na porta 5000, mas o cliente também requer uma porta de socket para se conectar ao servidor. Esta porta é atribuída aleatoriamente pela chamada de conexão do cliente. Neste caso, é 57822. Então, é isso para a programação de socket em Python, programas de exemplo de servidor e cliente de socket em Python. Referência: Documentação Oficial
Source:
https://www.digitalocean.com/community/tutorials/python-socket-programming-server-client