O que é programação de soquete em Python e como dominá-la?



Aprenda o que é programação de soquete em Python junto com comunicações cliente-servidor junto com a transferência de objetos python usando pickle e sockets.

A Internet tornou-se inegavelmente a ‘Alma da Existência’ e sua atividade é caracterizada por ‘Conexões’ ou ‘Redes’. Essas redes são possíveis usando um dos fundamentos mais cruciais de Tomadas. Este artigo cobre todas as áreas que lidam com programação de soquete em Python. Os soquetes ajudam a fazer essas conexões, enquanto , sem dúvida, torna mais fácil.

Vamos dar uma olhada rápida em todos os tópicos abordados neste artigo:





Por que usar Sockets?
O que são soquetes em Python?
Como obter programação de soquete em Python
O que é um servidor?
O que é um cliente?
Echo Cliente-Servidor
Múltiplas Comunicações
Transferência de objetos Python



Por que usar Sockets?

Os soquetes são a espinha dorsal da rede. Eles possibilitam a transferência de informações entre dois programas ou dispositivos diferentes. Por exemplo, ao abrir seu navegador, você, como cliente, está criando uma conexão com o servidor para a transferência de informações.

Antes de mergulhar mais fundo nesta comunicação, vamos primeiro descobrir o que exatamente são esses soquetes.

O que são soquetes?

Em termos gerais, os soquetes são terminais internos construídos para enviar e receber dados. Uma única rede terá dois soquetes, um para cada dispositivo ou programa de comunicação. Esses soquetes são uma combinação de um endereço IP e uma porta. Um único dispositivo pode ter 'n' número de soquetes com base no número da porta que está sendo usada. Portas diferentes estão disponíveis para diferentes tipos de protocolos. Dê uma olhada na imagem a seguir para saber mais sobre alguns dos números de porta comuns e os protocolos relacionados:




portas comuns-SocketProgramminginPython-Edureka

Agora que você entendeu o conceito de soquetes, vamos dar uma olhada no módulo Socket do Python:

Como obter programação de soquete em Python:

Para obter a programação de soquete em Python, você precisará importar o tomada módulo ou . Este módulo consiste em métodos integrados que são necessários para criar soquetes e ajudá-los a se associarem.

Alguns dos métodos importantes são os seguintes:

MétodosDescrição

socket.socket ()

usado para criar sockets (necessário tanto no servidor quanto no cliente para criar sockets)

socket.accept ()

usado para aceitar uma conexão. Ele retorna um par de valores (conn, endereço) onde conn é um novo objeto socket para enviar ou receber dados e address é o endereço do socket presente na outra extremidade da conexão

socket.bind ()

usado para vincular ao endereço que é especificado como um parâmetro

socket.close ()

usado para marcar o soquete como fechado

socket.connect ()

usado para conectar a um endereço remoto especificado como o parâmetro

socket.listen ()

permite que o servidor aceite conexões

Agora que você entendeu a importância do módulo de soquete, vamos prosseguir para ver como ele pode servir para criar servidores e clientes para programação de soquete em .

O que é um servidor?

Um servidor é um programa, um computador ou um dispositivo dedicado ao gerenciamento de recursos de rede. Os servidores podem estar no mesmo dispositivo ou computador ou conectados localmente a outros dispositivos e computadores ou até mesmo remotos. Existem vários tipos de servidores, como servidores de banco de dados, servidores de rede, servidores de impressão, etc.

Os servidores normalmente usam métodos como socket.socket (), socket.bind (), socket.listen (), etc, para estabelecer uma conexão e vincular aos clientes. Agora vamos escrever um programa para criar um servidor. Considere o seguinte exemplo:

EXEMPLO:

import socket s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.bind ((socket.gethostname (), 1234)) #port number pode ser qualquer coisa entre 0-65535 (geralmente especificamos portas não pré-licenciadas que são > 1023) s.listen (5) enquanto True: clt, adr = s.accept () print (f'Conexão com {adr} estabelecida ') #f string é uma string literal prefixada com f que #contém expressões python entre colchetes clt .send (bytes ('Socket Programming in Python', 'utf-8')) #para enviar informações para clientsocket

Como você pode ver, a primeira necessidade para criar um socket é importar o módulo de socket. Depois disso, o método socket.socket () é usado para criar um socket do lado do servidor.

NOTA:

AF_INET se refere ao endereço da Internet e requer um par de (host, porta) onde o host pode ser uma URL de algum site específico ou seu endereço e o número da porta é um inteiro. SOCK_STREAM é usado para criar protocolos TCP.

é um relacionamento em java

O método bind () aceita dois parâmetros como uma tupla (host, porta). No entanto, é melhor usar números de porta de 4 dígitos, pois os inferiores geralmente estão ocupados. O método listen () permite que o servidor aceite conexões. Aqui, 5 é a fila para várias conexões que surgem simultaneamente. O valor mínimo que pode ser especificado aqui é 0 (se você fornecer um valor menor, ele será alterado para 0). Caso nenhum parâmetro seja especificado, ele usa um padrão adequado.

o permite aceitar conexões para sempre. ‘Clt’ e ‘adr’ são o objeto e o endereço do cliente. A instrução print apenas imprime o endereço e o número da porta do soquete do cliente. Finalmente, clt.send é usado para enviar os dados em bytes.

Agora que nosso servidor está pronto, vamos seguir em direção ao cliente.

O que é um cliente?

Um cliente é um computador ou software que recebe informações ou serviços do servidor. Em um módulo cliente-servidor, os clientes solicitam serviços dos servidores. O melhor exemplo é um navegador da web como Google Chrome, Firefox, etc. Esses navegadores da web solicitam servidores da web para as páginas da web e serviços necessários, conforme orientado pelo usuário. Outros exemplos incluem jogos online, chats online, etc.

Agora vamos dar uma olhada em como codificar o programa do lado do cliente em :

EXEMPLO:

import socket s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.connect ((socket.gethostname (), 2346)) msg ​​= s.recv (1024) print (msg.decode ('utf-8') )

A primeira etapa é importar o módulo de soquete e, em seguida, criar um soquete exatamente como você fez ao criar um servidor. Então, para criar uma conexão entre o cliente-servidor, você precisará usar o método connect () especificando (host, porta).


NOTA: gethostname é usado quando o cliente e o servidor estão no mesmo computador. (LAN - localip / WAN - publicip)

Aqui, o cliente deseja receber algumas informações do servidor e para isso, você precisa usar o método recv () e as informações são armazenadas em outra variável msg. Basta lembrar que a informação que está sendo passada será em bytes e no cliente do programa acima pode receber até 1024 bytes (tamanho do buffer) em uma única transferência. Pode ser especificado em qualquer valor, dependendo da quantidade de informações transferidas.

Finalmente, a mensagem que está sendo transferida deve ser decodificada e impressa.

Agora que você sabe como criar programas cliente-servidor, vamos prosseguir para ver como eles precisam ser executados.

Cliente-servidor Echo:

Para executar esses programas, abra seu prompt de comando, vá para a pasta onde você criou seu programa cliente e servidor e digite:

py server.py (aqui, server.py é o nome do arquivo do servidor, você também pode usar py -3,7 server.py)

Feito isso, o servidor começa a funcionar. Para executar o cliente, abra outra janela cmd e digite:

py client.py (aqui, client.py é o nome do arquivo do cliente)

SAÍDA (SERVIDOR):

(CLIENTE)

Vamos tentar o mesmo programa reduzindo o tamanho do buffer para 7 e ver qual saída obtemos:

RESULTADO:

Como você pode ver, a conexão é encerrada após a transferência de 7 bytes. Mas isso é um problema porque você não recebeu as informações completas e a conexão foi encerrada. Vamos resolver esse problema.

Várias comunicações:

Para que a conexão continue até que o cliente receba as informações completas, você pode usar o loop while:

o que é namespace em c ++

EXEMPLO:

import socket s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.connect ((socket.gethostname (), 2346)) enquanto True: msg = s.recv (7) print (msg.decode ('utf- 8 '))

Depois de fazer isso, a mensagem completa será recebida em 7 bytes por transferência.

Mas desta vez, como você pode ver, a conexão não é encerrada e você nunca sabe quando isso vai acontecer. E para adicionar a isso, e se você realmente não souber o quão grande é a mensagem ou informação que o cliente receberá do servidor. Nesses casos, você pode usar o seguinte código no lado do cliente:

EXEMPLO:

complete_info = '' enquanto Verdadeiro: msg = s.recv (7) se len (msg)<=0: break complete_info += msg.decode('utf-8') print(complete_info) 

No lado do servidor, use o método close () da seguinte maneira:

clt.close ()

A saída disso será conforme mostrado na imagem abaixo:

RESULTADO:



Tudo o que o bloco de código acima faz é verificar o tamanho das informações e imprimi-las em um buffer de dois bytes por vez, além de fechar a conexão depois de concluída.

Transferindo objetos Python:

Até aqui, você acabou de aprender a transferir cordas. Mas, programação de soquete em Pitão também permite que você transfira objetos Python também. Esses objetos podem ser qualquer coisa como conjuntos, tuplas, dicionários, etc. Para conseguir isso, você precisará importar o módulo pickle do Python.

Módulo pickle Python:

O módulo pickle Python entra em cena quando você está realmente serializando ou desserializando objetos em Python. Vamos dar uma olhada em um pequeno exemplo,

EXEMPLO:

import pickle mylist = [1,2, 'abc'] mymsg = pickle.dumps (mylist) print (mymsg)

RESULTADO: b’x80x03] qx00 (Kx01Kx02Xx03x00x00x00abcqx01e. ’

Como você pode ver, no programa acima, ‘mylist’ é serializado usando a função dumps () do módulo pickle. Observe também que a saída começa com um ‘b’, o que significa que é convertido em bytes. Na programação de soquete, você pode implementar este módulo para transferir objetos python entre clientes e servidores.

Como usar o módulo pickle para transferir estruturas de objetos Python?

Quando você usa pickle junto com soquetes, pode absolutamente transferir qualquer coisa pela rede. Vamos anotar as contrapartes do lado do servidor e do lado do cliente para transferir uma lista do servidor para o cliente:

Lado do servidor:

import socket import pickle a = 10 s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.bind ((socket.gethostname (), 2133)) #binding tuple s.listen (5) enquanto True: clt, adr = s.accept () print (f'Conexão com {adr} estabelecida ') m = {1:' Cliente ', 2:' Servidor '} mymsg = pickle.dumps (m) # msg que queremos imprimir mais tarde mymsg = {len (mymsg): {a}} 'utf-8') + mymsg clt.send (mymsg)

Aqui, m é um dicionário que é basicamente um que precisa ser enviado do servidor para o cliente. Isso é feito primeiro serializando o objeto usando dumps () e depois convertendo-o em bytes.
Agora vamos escrever a contrapartida do lado do cliente:

Cliente:

import socket import pickle a = 10 s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.connect ((socket.gethostname (), 2133)) while True: complete_info = b '' rec_msg = True enquanto True: mymsg = s.recv (10) if rec_msg: print (f'The length of message = {mymsg [: a]} ') x = int (mymsg [: a]) rec_msg = False complete_info + = mymsg if len (complete_info) -a == x: print ('Recebeu as informações completas') print (complete_info [a:]) m = pickle.loads (complete_info [a:]) print (m) rec_msg = True complete_info = b '' print (complete_info )

O primeiro loop while nos ajudará a acompanhar a mensagem completa (complete_info), bem como a mensagem que está sendo recebida (rec_msg) usando o buffer. a mensagem definindo rec_
Então, enquanto a mensagem está sendo recebida, tudo o que faço é imprimir cada bit dela, sendo recebido em um buffer de tamanho 10. Este tamanho pode ser qualquer um dependendo da sua escolha pessoal.

Então, se a mensagem recebida for igual à mensagem completa, eu estou apenas imprimindo a mensagem como informação completa recebida e, em seguida, desserializei a mensagem usando load ().

A saída para o programa acima é a seguinte:

Isso nos leva ao final deste artigo sobre programação de soquetes em Python. Espero que você tenha entendido todos os conceitos claramente.

Pratique o máximo possível e reverta sua experiência.

Tem alguma questão para nós? Mencione isso na seção de comentários deste blog “Programação de soquetes em Python” e entraremos em contato com você o mais breve possível.

Para obter conhecimento aprofundado sobre Python, juntamente com seus vários aplicativos, você pode se inscrever para com suporte 24/7 e acesso vitalício.