Envio e recebimento de arquivos em Python
Publicado por Fagner Amaral de Souza Candido (última atualização em 14/12/2010)
[ Hits: 25.655 ]
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()
Tradutor on-line em Python+GTK
hdns - Enumerador de diretórios
Gentoo: detectando impressoras de rede e como fixar uma impressora por IP
Como o GNOME conseguiu o feito de ser preterido por outras interfaces gráficas
Gentoo binário em 2026: UEFI, LUKS, Btrfs e Systemd
Trabalhando Nativamente com Logs no Linux
Jogando Daikatana (Steam) com Patch 1.3 via Luxtorpeda no Linux
Por que sua empresa precisa de uma PKI (e como automatizar EMISSÕES de certificados via Web API)
Instalando NoMachine no Gentoo com Systemd (acesso Remoto em LAN)
Gentoo: Trocando wpa_supplicant pelo iwd no NetworkManager (Systemd)
Alterar conteúdo de dica [RESOLVIDO] (3)
Vou destruir sua infância:) (5)
Quando vocês pararam de testar distros? (23)









