Pitão

Python Socket File Transfer Send

Python Socket File Transfer Send
A intenção deste artigo é aprender como transferir um arquivo de texto pela rede através do programa python. Esta transferência de arquivo é baseada no modelo do cliente servidor para usar a programação de soquete em python3+.

Diagrama de configuração básica:

Aqui está o diagrama básico de configuração para executar este programa.

Para simplificar, chamaremos o Sistema A de A_client e o Sistema B de B_server ao longo do artigo.

Requisitos de arquivo:

Nós precisamos servidor.py e este arquivo deve estar presente no sistema do servidor. No nosso caso, servidor.py deve estar no sistema B_server.

Outros dois arquivos cliente.py e amostra.TXT deve estar presente no sistema do cliente. No nosso caso, esses dois arquivos devem estar presentes no sistema A_client.

Premissas:

Aqui estão as premissas:

Limitações:

Antes de prosseguirmos, devemos saber que existem algumas limitações deste programa.

Requisitos de configuração:

Código-fonte do servidor:

https: // github.com / linuxhintcode / websamples / blob / master / python_send_file / server.py

Código-fonte do cliente:

https: // github.com / linuxhintcode / websamples / blob / master / python_send_file / client.py

Como executar programas e resultados esperados:

Aqui estão as etapas para executar o programa.

Passo 1: Vá para o sistema B_server e abra um terminal. O atalho para abrir um terminal é Alt + Ctrl + t.

Passo 2: Agora vá para o caminho onde o servidor.py está presente.

Passo 3: Agora execute o servidor.py como abaixo

servidor python3.py

Não deve haver nenhum erro e você deve ver as impressões abaixo

O servidor está listado na porta: 9898

O nome do arquivo copiado será recebido.txt no lado do servidor

Passo 4: Agora abra o terminal no sistema A_client.

Passo 5: Vá para o caminho onde o cliente.py e amostra.txt estão presentes.

Passo 6: Agora execute o cliente.py como abaixo

cliente python3.py

Observamos que precisamos saber o endereço IP do servidor. Podemos executar o comando abaixo para saber o endereço IP do sistema B_server.

ifconfig

Agora a saída do sistema A_client deve ser assim

####################### A mensagem abaixo é recebida do servidor #####################
| --------------------------------- |
Olá, cliente, [endereço IP: 192.168.1.102],
** Bem-vindo ao servidor **
-Servidor
| --------------------------------- |

Passo 7: Agora vá para B_server e procure a saída abaixo

O arquivo foi copiado com sucesso
Servidor fechou a conexão

Etapa 8: Deve haver um nome de arquivo recv.txt na pasta do servidor. O conteúdo deste recv.txt deve ser a mesma amostra.TXT.

Então, copiamos com sucesso um arquivo do cliente para o servidor pela rede por meio do programa python.

Explicações do código:

Existem dois arquivos python servidor.py e cliente.py.

Observe que iremos explicar uma vez se algum código é o mesmo dentro do servidor.py e cliente.py.

  1. servidor.py:
#!/ usr / bin / env python3

Esta é uma linha simples, o que significa que por padrão este servidor.py deve usar python3. Vamos ver uma vantagem desta linha.

Executamos o servidor.py ou cliente.py como python3 <.py file name>. Agora, sem usar o python3, podemos executar o arquivo python. Siga os comandos abaixo

Vá para o modo superusuário:

su

Dê toda a permissão para .arquivo py:

servidor chmod 777.py

Executar servidor.py:

./servidor.py import socket
Importando a biblioteca de soquetes para o programa python conforme estamos indo
usar soquete para conexão.
s = socket.socket ()

Estamos criando um objeto “S” para acessar todos os métodos de soquete. Este é um conceito OOPs.

PORT = 9898

Agora escolhemos uma porta onde o servidor estará escutando. Podemos usar uma porta não reservada em vez desta.

s.vincular ((", PORTA))

Usamos o método de ligação para vincular o endereço IP do servidor a essa porta [9898]. Uma observação é que poderíamos ter usado o endereço IP exato do servidor no lugar do primeiro argumento do método de ligação, mas optamos por deixar em branco porque isso funciona bem.

s.vincular ((endereço IP, PORTA))
arquivo = aberto ("recv.txt "," wb ")

Abrimos um arquivo com o nome “recv.txt ”no servidor para modo de gravação e apontador de arquivo obtido. Isso é necessário porque temos que copiar um arquivo de texto do cliente.

enquanto verdadeiro:

Vamos começar um loop while infinito já que o trabalho do servidor é esperar até que um cliente se comunique com o servidor naquela porta 9898. Portanto, este loop while é necessário.

conexão, addr = s.aceitar()

Este código é para aceitar qualquer solicitação de conexão de entrada do cliente. Conn vai usar “conn ” para se comunicar com o cliente e “Addr” é o endereço IP do cliente que enviou um pedido de comoção para este servidor na porta 9898.

msg = "\ n \ n | --------------------------------- | \ n Olá cliente [endereço IP:
"+ addr [0] +"], \ n ** Bem-vindo ao servidor ** \ n -Server \ n
| --------------------------------- | \ n \ n \ n "

Este código é para criar uma mensagem para enviar ao cliente. Esta mensagem deve ser impressa no terminal do cliente. Isso confirma que o cliente é capaz de se comunicar com o servidor.

con.enviar (msg.codificar())

Agora temos a mensagem pronta e, em seguida, enviamos para o cliente usando aquele “Conn”. Este código realmente envia mensagem ao cliente.

RecvData = conn.recv (1024)

Este código está recebendo todos os dados enviados do lado do cliente. Em nosso caso, estamos esperando o conteúdo da amostra.txt em “RecvData”.

enquanto RecvData:

Mais um loop while com a condição RecvData não está vazio. No nosso caso não está vazio.

Arquivo.escrever (RecvData)

Assim que tivermos conteúdo dentro “RecvData” então estamos escrevendo para aquele arquivo “Recv.TXT" usando o ponteiro do arquivo "Arquivo".

RecvData = conn.recv (1024)

Tentando novamente receber se há algum dado do cliente. Uma vez “RecvData” não tem dados o código irá quebrar o loop while.

Arquivo.perto()

Isto irá apenas fechar o ponteiro do arquivo, uma vez que terminamos com a gravação do arquivo.

con.perto()

Isso irá fechar a conexão com o cliente.

pausa

Isso deve sair do loop while infinito em B_server.

  1. cliente.py:
import sys

Importando a biblioteca sys como queremos usar a facilidade de argumento em python.

if (len (sys.argv)> 1):
ServerIp = sys.argv [1]
senão:
print ("\ n \ n Executar como \ n cliente python3.py < serverip address > \ n \ n ")
saída (1)

Conforme passamos o endereço IP de B_server após o nome do arquivo cliente.py durante a execução, precisamos capturar o endereço IP do servidor dentro do cliente.

… If (len (sys.argv)> 1): => Para garantir que o usuário passe pelo menos um argumento como endereço IP e pegue esse endereço IP insdie "IP do servidor".

Se o usuário não passar pelo menos um argumento, o código mostra ajuda e sai do código.

PORT = 9898

Deve ser a mesma porta mencionada no lado B_server.

s.conectar ((ServerIp, PORT))

Este código fará a conexão TCP ao IP do servidor com aquela porta. Qualquer coisa errada neste ponto resulta em falhas na conexão.

file = open ("amostra.txt "," rb ")

Estamos abrindo “amostra.txt ”no modo de leitura para ler apenas o conteúdo.

SendData = arquivo.ler (1024)

Lendo o conteúdo do arquivo e colocando dentro “SendData ” variável.

enquanto SendData:

Estamos iniciando um loop while se “SendData ” tem dados. Em nosso caso, se “amostra.txt ”não está vazio, deve ter dados.

s.enviar (SendData)

Agora podemos enviar conteúdo de "amostra.TXT" para o servidor usando o objeto socket “S”.

SendData = arquivo.ler (1024)

Lendo novamente se sobrou alguma coisa. Portanto, não haverá nada para ler do arquivo “SendData” estará vazio e sairá do loop while.

s.perto()

Isso não fecha a conexão do lado do cliente.

Ubuntu Screenshots do lado do servidor

Ubuntu Screenshots do lado do cliente

Combinações testadas:

  • Linux como servidor e Linux como cliente: PASS
  • Linux como cliente e Linux como servidor: PASS
  • Linux como servidor e Windows10 como cliente: PASS
  • Linux como cliente e Windows10 como servidor: PASS

A recomendação é usar dois sistemas Linux para servidor e cliente.

Erros esperados:

  1. Você pode ver o erro abaixo se o servidor não estiver rodando na porta 9898

Traceback (última chamada mais recente):

Arquivo "cliente.py ", linha 22, em
s.conectar ((ServerIp, PORT))
ConnectionRefusedError: [Errno 111] Conexão recusada
  1. O erro abaixo é visto se o endereço IP não for passado no lado do cliente

Correr como

cliente python3.py < serverip address >
  1. Abaixo o erro é visto se 1st argumento do lado do cliente não é um endereço IP

Traceback (última chamada mais recente):

Arquivo "cliente.py ", linha 22, em
s.conectar ((ServerIp, PORT))
tomada.gaierror: [Errno -2] Nome ou serviço desconhecido
  1. O erro abaixo é visto se a porta for usada como 98980

Traceback (última chamada mais recente):

Arquivo "cliente.py ", linha 22, em
s.conectar ((ServerIp, PORT))
OverflowError: getsockaddrarg: port deve ser 0-65535.
  1. Abaixo o erro é visto se “amostra.txt ”não está presente no lado do cliente.

Traceback (última chamada mais recente):

Arquivo "cliente.py ", linha 25, em
file = open ("amostra.txt "," rb ")
FileNotFoundError: [Errno 2] Nenhum arquivo ou diretório: 'amostra.TXT'

Conclusão:

Usando este programa, podemos enviar um arquivo de texto simples de um sistema para outro sistema através da rede usando o programa python. Isso nos dá um aprendizado básico de programação python e socket, também para enviar dados pela rede.

Adicione gestos do mouse ao Windows 10 usando essas ferramentas gratuitas
Nos últimos anos, os computadores e sistemas operacionais evoluíram muito. Houve um tempo em que os usuários tinham que usar comandos para navegar pel...
Controle e gerencie o movimento do mouse entre vários monitores no Windows 10
Gerenciador de mouse com tela dupla permite que você controle e configure o movimento do mouse entre vários monitores, diminuindo seus movimentos pert...
WinMouse permite que você personalize e melhore o movimento do ponteiro do mouse no PC com Windows
Se você quiser melhorar as funções padrão do ponteiro do mouse, use um freeware WinMouse. Ele adiciona mais recursos para ajudá-lo a obter o máximo do...