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 +.

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 server.py e este arquivo deve estar presente no sistema do servidor. Em nosso caso, server.py deve estar no sistema B_server.





Outros dois arquivos client.py e sample.txt deve estar presente no sistema do cliente. Em nosso caso, esses dois arquivos devem estar presentes no sistema A_client.

Premissas:

Aqui estão as premissas:



  • Devemos ter dois sistemas Linux com acesso ao terminal.
  • O sabor preferido do Linux é Ubuntu .
  • Python3 deve ser instalado.
  • Ambos os sistemas Linux devem ser capazes de executar ping um no outro. Usar ping comando para verificar o ping.
  • Um sistema deve atuar como servidor e outro sistema deve atuar como cliente em um determinado momento.

Limitações:

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

  • Python3 + deve ser instalado para executar este programa. Você pode observar erro ou comportamento diferente se executado em versões anteriores do python.
  • Apenas o arquivo de texto pode ser transferido por meio deste programa a partir de agora. Qualquer outro arquivo de formato que não contenha texto pode falhar.
  • Exceções básicas de programação foram tratadas no programa.
  • O programa pode ou não ser executado em outro sistema operacional que não o Ubuntu.
  • O arquivo de texto deve ser curto no lado do cliente, pois o tamanho do buffer de 1024 bytes foi usado.

Requisitos de configuração:

  • Precisamos de pelo menos um sistema Linux para experimentar este programa. Mas a recomendação é usar dois sistemas Linux diferentes que estão conectados pela rede.
  • Dois sistemas devem ser conectados por Ethernet ou Wi-Fi ou qualquer outra conexã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 server.py está presente.

Passo 3: Agora execute server.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á recv.txt no lado do servidor

Passo 4: Agora abra o terminal no sistema A_client.

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

Passo 6: Agora execute client.py como abaixo

cliente python3.py <IP do sistema B_server>

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 #####################
| --------------------------------- |
Oi 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 o mesmo sample.txt.

Portanto, 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 server.py e client.py .

Observe que explicaremos uma vez se algum código for o mesmo em server.py e client.py.

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

Esta é a linha shebang, o que significa que por padrão este server.py deve usar python3. Vamos ver uma vantagem dessa linha.

Executamos o server.py ou client.py like python3. Agora, sem usar o python3, podemos executar o arquivo python. Siga os comandos abaixo

Vá para o modo superusuário:

Está

Dê permissão total ao arquivo .py:

chmod777servidor.py

Execute server.py:

./servidor.py importar tomada
Importandotomadabiblioteca em programa pythonComonós vamos
usartomada paraconexão.

s = tomada.tomada()

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

PORTA= 9898

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

s.ligar(('',PORTA))

Usamos o método bind 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, pois isso funciona bem.

s.ligar((endereço de IP,PORTA))
Arquivo = abrir('recv.txt', 'wb')

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

enquanto Verdade:

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

con,addr=s.aceitar()

Este código é para aceitar qualquer solicitação de conexão de entrada do cliente. Conn vai usar con para se comunicar com o cliente e addr é o endereço IP do cliente que enviou a solicitação de comoção para este servidor na porta 9898.

msg= ' n n| --------------------------------- | nOlá, cliente, [endereço IP:
'
+ addr[0]+'], n** Bem-vindo ao servidor ** n-Servidor 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.mandar(msg.codificar())

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

RecvData=con.recv(1024)

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

enquantoRecvData:

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=con.recv(1024)

Tentando novamente receber se houver algum dado do cliente. Uma vez RecvData não tem dados, o código interromperá o loop while.

Arquivo.fechar()

Isso apenas fechará o ponteiro do arquivo quando terminarmos com a gravação do arquivo.

con.fechar()

Isso encerrará a conexão com o cliente.

pausa

Isso deve sair do loop while infinito em B_server.

  1. client.py:
importar sys

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

E se (len(sys.argv) > 1):
IP do servidor= sys.argv[1]
outro:
imprimir(' n nCorrer como npython3 client.py n n')
saída(1)

Conforme passamos o endereço IP de B_server após o nome do arquivo client.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.

PORTA= 9898

Deve ser a mesma porta mencionada no lado do B_server.

s.conectar((IP do servidor,PORTA))

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.

Arquivo = abrir('sample.txt', 'rb')

Estamos abrindo sample.txt no modo de leitura para ler apenas o conteúdo.

SendData= Arquivo.leitura(1024)

Ler o conteúdo do arquivo e colocá-lo dentro SendData variável.

enquantoSendData:

Estamos iniciando um loop while se SendData tem dados. Em nosso caso, se sample.txt não estiver vazio, ele deve conter dados.

s.mandar(SendData)

Agora podemos enviar conteúdo de sample.txt para o servidor usando o objeto socket s.

SendData= Arquivo.leitura(1024)

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

s.fechar()

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'client.py',linha22, no <módulo>
s.conectar((IP do servidor,PORTA))
ConnectionRefusedError:[Errno111]Ligaçã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 <endereço serverip>
  1. Abaixo o erro é visto se 1stargumento do lado do cliente não é um endereço IP

Traceback (última chamada mais recente):

Arquivo'client.py',linha22, no <módulo>
s.conectar((IP do servidor,PORTA))
tomada.gaierror:[Errno -2]Nomeouserviçonãoconhecido
  1. O erro abaixo é visto se a porta for usada como 98980

Traceback (última chamada mais recente):

Arquivo'client.py',linha22, no <módulo>
s.conectar((IP do servidor,PORTA))
OverflowError: getsockaddrarg: a porta deve ser0-65535.
  1. O erro abaixo é visto se sample.txt não estiver presente no lado do cliente.

Traceback (última chamada mais recente):

Arquivo'client.py',linha25, no <módulo>
Arquivo = abrir('sample.txt', 'rb')
FileNotFoundError:[Errno2]Não desta maneiraArquivo oudiretório:'sample.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 python e programação de socket, também para enviar dados pela rede.