Programação de Socket em Python – Exemplo de Servidor, Cliente

Bom dia aprendizes! Em nosso tutorial anterior, discutimos sobre o módulo Python unittest. Hoje vamos examinar um exemplo de programação de socket em Python. Vamos criar 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 saber sobre 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 espera por solicitações do cliente e as atende ou as processa conforme necessário. Por outro lado, um cliente é o solicitante deste serviço. Um programa cliente solicita recursos ao servidor e o servidor responde a essa solicitação. Socket é o ponto final de um canal de comunicação bidirecional entre servidor e cliente. Os sockets podem se comunicar 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 através de uma porta de socket. O principal objetivo deste tutorial de programação de socket é apresentar 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

Já mencionamos anteriormente que um cliente de soquete solicita alguns 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.

  1. O programa do servidor de soquete em Python é executado primeiro e aguarda qualquer solicitação
  2. O programa do cliente de soquete em Python iniciará a conversa primeiro
  3. Em seguida, o programa do servidor responderá de acordo com as solicitações do cliente
  4. O programa do cliente será encerrado se o usuário inserir a mensagem “bye”. O programa do servidor também será encerrado quando o programa do cliente for encerrado; 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 soquetes Python como socket_server.py. Para usar a conexão de soquetes 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 número de porta acima de 1024 porque números de porta menores que 1024 são reservados para o protocolo de internet padrão. Veja o código de exemplo do servidor de soquetes Python abaixo, os comentários irão ajudá-lo a entender o código.

import socket


def server_program():
    # obter o nome do host
    host = socket.gethostname()
    port = 5000  # initiate port no above 1024

    server_socket = socket.socket()  # get instance
    # observe atentamente. A função bind() recebe uma tupla como argumento
    server_socket.bind((host, port))  # bind host address and port together

    # configurar 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:
        # receber 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, interromper
            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 soquetes Python está rodando na porta 5000 e ele aguardará a solicitação do cliente. Se você deseja 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 aguardando a solicitação do cliente.

Cliente de Soquete Python

Vamos salvar o programa do cliente de socket Python como socket_client.py. Este programa é semelhante ao programa do servidor, exceto pela ligação. A principal diferença entre o programa do servidor e do cliente é que, no programa do servidor, é necessário unir o endereço do host e o endereço da porta. Veja o exemplo de código abaixo do cliente de socket Python, os comentários ajudarão 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()

Resultados 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 do cliente. Em seguida, escreva novamente a resposta do programa do servidor. Por último, escreva bye a partir do programa do cliente para encerrar ambos os programas. O breve vídeo abaixo mostrará como funcionou no meu teste do servidor de socket e nos programas de exemplo de cliente.

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á em execução na porta 5000, mas o cliente também precisa de uma porta de soquete 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