Envio e recebimento de arquivos em Python
Publicado por Fagner Amaral de Souza Candido (última atualização em 14/12/2010)
[ Hits: 25.615 ]
Homepage: https://github.com/fagnercandido
Download pythonArquivos.tar.gz
Olá PessoALL,
Diversas vezes vi em fóruns e sites, a galera pedindo exemplos de troca de arquivos entre máquinas, fazendo uso da rede e em alguma linguagem de programação.
A solução aqui proposta é muito simples: uma aplicação cliente-servidor. O cliente se conecta ao servidor e envia o arquivo para o servidor. O servidor por sua vez, salva no local de sua execução o arquivo enviado, com o mesmo nome enviado pelo cliente. Tudo isso é feito usando a linguagem Python, usando a API de sockets e usando conexões TCP.
Outro detalhe que vale ser ressaltado é que o aplicativo foi testado em localhost e em máquinas separadas, neste segundo caso, foram usadas máquinas virtuais na mesma rede.
Qualquer dúvida, sugestão ou crítica sempre serão bem-vindas.
'''
Sintese
Objetivo : Cliente para envio/recebimento de arquivos
Entrada : Um possivel arquivo
Saida : Um possivel arquivo
Autor : f_Candido - fagner7777777@gmail.com
'''
import socket
class Client:
'''
Construtor
host - Servidor para conexoes
port - Porta para conexao
tcp - Conexao TCP que sera aberta
dest - Destino para conexao
'''
def __init__(self):
print __doc__
self._host = '127.0.0.1' # Endereco IP do Servidor
self._port = 7777 # Porta que o Servidor esta
self._tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self._dest = (self._host, self._port)
self._tcp.connect(self._dest)
self._nameFile = 'teste.doc'
'''
Fechando a conexao TCP
'''
def closeConnection(self):
self._tcp.close()
'''
Enviando o arquivo
'''
def sendFile(self):
self._tcp.send (self._texto)
'''
Lendo o arquivo do fileSystem
'''
def readFile(self):
self._fileOpen = open(self._nameFile, "r")
self.mountPackage()
self._tmp = self._fileOpen.read()
self._texto = self._texto + self._tmp
self._fileOpen.close()
'''
E criado uma especie de pacote para envio
Nele sao enviados o nome do arquivo e seu conteudo
Tambem e criado uma marcacao para tal : __##
'''
def mountPackage(self):
self._texto = self._nameFile+'__##'
print self._texto
objClient = Client()
objClient.readFile()
objClient.sendFile()
objClient.closeConnection()
'''
Sintese
Objetivo : Servidor para envio/recebimento de arquivos
Entrada : Um possivel arquivo
Saida : Um possivel arquivo
Autor : f_Candido - fagner7777777@gmail.com
'''
import socket
class Server():
'''
Construtor
hostServer - Servidor para conexoes
portServer - Porta para conexao
tcp - Conexao TCP que sera aberta
orig - Origem da conexao
'''
def __init__(self):
self._hostServer = '127.0.0.1' # Endereco IP do Servidor
self._portServer = 7777 # Porta que o Servidor esta
self._tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self._orig = (self._hostServer, self._portServer)
self._tcp.bind(self._orig)
self._tcp.listen(999999)
self._nameFile = ''
print __doc__
'''
Recebido o pacote, ele retira o cabecalho e retorna o real conteudo
'''
def breakPackage(self):
self._tmp = self._msg.split('__##')
self._nameFile = self._tmp[0]
self._msg = self._tmp[1]
'''
Recebe o arquivo
'''
def receiveFile(self):
self._connection, self._client = self._tcp.accept()
print 'Conectado por', self._client
while True:
self._msg = self._connection.recv(4096)
if not self._msg: break
self.breakPackage()
self.writeFile()
'''
Escreve o arquivo em disco
'''
def writeFile(self):
self._fileOpen = open(self._nameFile, "w")
self._fileOpen.write(self._msg)
self._fileOpen.close()
'''
Fecha a conexao
'''
def closeConnection(self):
self._connection.close()
objServer = Server()
objServer.receiveFile()
objServer.closeConnection()
Cliente/Servidor Usando Python
Cirurgia para acelerar o openSUSE em HD externo via USB
Void Server como Domain Control
Modo Simples de Baixar e Usar o bash-completion
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
Como fazer a conversão binária e aplicar as restrições no Linux
Como quebrar a senha de um servidor Linux Debian
Como bloquear pendrive em uma rede Linux
Um autoinstall.yaml para Ubuntu com foco em quem vai fazer máquina virtual
Instalar GRUB sem archinstall no Arch Linux em UEFI Problemático









