Desde que a pasta pode ter um diretório multi-camada, por isso precisa ser travessia recursiva.
Este trabalho levou a personalização protocolo simples, define cinco comandos, instruções Cabeça da seguinte forma:
Sincronização: identifica o pastas iniciar a sincronização
Finais: identificando sincronização final
do arquivo: identifica o nome do arquivo de transferência de (caminho relativo)
Pasta: pasta flag (caminho relativo)
Nenhum : conteúdo do arquivo
Cada comando CMB_BEGIN começar a final CMB_END.
As necessidades do cliente a ser feito para resolver o buffer de recepção, uma extração de uma instrução, em seguida, fazer instruções cabeçote de acordo com o processamento correspondente, como criar pastas, arquivos escritos.
Aqui está o código do servidor:
from twisted.internet import reactor
from twisted.internet.protocol import Protocol,Factory
from twisted.protocols.basic import LineReceiver
import os
import struct
BUFSIZE = 4096
class SimpleLogger(Protocol):
def connectionMade(self):
print 'Got connection from', self.transport.client
def connectionLost(self, reason):
print self.transport.client, 'disconnected'
def dataReceived(self, line):
print line
self.transport.write("Hello Client, I am the Server!\r\n")
self.transport.write("CMB_BEGIN")
self.transport.write("Sync")
self.transport.write("CMB_END")
self.send_file_folder('server')
def send_file_folder(self,folder):
'''send folder to the client'''
for f in os.listdir(folder):
sourceF = os.path.join(folder, f)
if os.path.isfile(sourceF):
print 'File:',sourceF[7:]
self.transport.write("CMB_BEGIN")
self.transport.write("File:" + sourceF[7:])
self.transport.write("CMB_END")
fp = open(sourceF,'rb')
while 1:
filedata = fp.read(BUFSIZE)
if not filedata: break
else:
self.transport.write("CMB_BEGIN")
self.transport.write(filedata)
print 'send size:::::::::',len(filedata)
self.transport.write("CMB_END")
fp.close()
self.transport.write("CMB_BEGIN")
self.transport.write("End")
self.transport.write("CMB_END")
if os.path.isdir(sourceF):
print 'Folder:',sourceF[7:]
self.transport.write("CMB_BEGIN")
self.transport.write("Folder:" + sourceF[7:])
self.transport.write("CMB_END")
self.send_file_folder(sourceF)
factory = Factory()
factory.protocol = SimpleLogger
reactor.listenTCP(1234, factory)
reactor.run()
Cliente servidor após receber um sinal de (este código, quando basta enviar qualquer coisa para cliente servidor pode), servidor é chamado send_file_folder o conteúdo da pasta em Sever todos enviados para o cliente.
O servidor executa os resultados são os seguintes:
O seguinte é o código do cliente:
from twisted.internet.selectreactor import SelectReactor
from twisted.internet.protocol import Protocol,ClientFactory
from twisted.protocols.basic import LineReceiver
import os
from struct import *
reactor = SelectReactor()
protocol = Protocol()
prepare = 0
filename = ""
sourceDir = 'client'
recvBuffer = ''
def delete_file_folder(src):
'''delete files and folders'''
if os.path.isfile(src):
try:
os.remove(src)
except:
pass
elif os.path.isdir(src):
for item in os.listdir(src):
itemsrc = os.path.join(src,item)
delete_file_folder(itemsrc)
try:
os.rmdir(src)
except:
pass
def clean_file_folder(src):
'''delete files and child folders'''
delete_file_folder(src)
os.mkdir(src)
def writefile(filename,data):
print 'write file size:::::::::',len(data)
fp = open(filename,'a+b')
fp.write(data)
fp.close()
class QuickDisconnectedProtocol(Protocol):
def connectionMade(self):
print "Connected to %s."%self.transport.getPeer().host
self.transport.write("Hello server, I am the client!\r\n")
def dataReceived(self, line):
global prepare
global filename
global sourceDir
global recvBuffer
recvBuffer = recvBuffer + line
self.processRecvBuffer()
def processRecvBuffer(self):
global prepare
global filename
global sourceDir
global recvBuffer
while len(recvBuffer) > 0 :
index1 = recvBuffer.find('CMB_BEGIN')
index2 = recvBuffer.find('CMB_END')
if index1 >= 0 and index2 >= 0:
line = recvBuffer[index1+9:index2]
recvBuffer = recvBuffer[index2+7:]
if line == 'Sync':
clean_file_folder(sourceDir)
if line[0:3] == "End":
prepare = 0
elif line[0:5] == "File:":
name = line[5:]
filename = os.path.join(sourceDir, name)
print 'mk file:',filename
prepare = 1
elif line[0:7] == "Folder:":
name = line[7:]
filename = os.path.join(sourceDir, name)
print 'mkdir:',filename
os.mkdir(filename)
elif prepare == 1:
writefile(filename,line)
else:
break
class BasicClientFactory(ClientFactory):
protocol=QuickDisconnectedProtocol
def clientConnectionLost(self,connector,reason):
print 'Lost connection: %s'%reason.getErrorMessage()
reactor.stop()
def clientConnectionFailed(self,connector,reason):
print 'Connection failed: %s'%reason.getErrorMessage()
reactor.stop()
reactor.connectTCP('localhost',1234,BasicClientFactory())
reactor.run()
O cliente extrai o comando do Servidor quando extraído comando Sync, ele vai SourceDir diretório vazio, então sob as instruções de acompanhamento, arquivo com a pasta Server para sincronização.
O cliente executa a seguinte:
onde Nota:
Quando cliente escrito para o arquivo, você precisa abrir o arquivo em modo binário, caso contrário, podem ocorrer erros ou levar a arquivos corrompidos durante a transferência de arquivos binários.
Após o teste, o código pode ser uma operação normal, a sincronização de pastas é bem sucedida, arquivos de texto, imagens e outros tipos de arquivos binários pode ser a transmissão normal.
Finalmente, eu recomendo um python reunião boa reputação [ clique para entrar ], há um monte de veteranos habilidades de aprendizagem, experiência de aprendizagem
, Habilidades de entrevista, experiência de trabalho e outras ações, preparou o mais cuidadosamente a informação introdutória base zero, informações sobre projetos reais, os programadores todos os dias
método de Python para explicar o timing da tecnologia, para compartilhar um pouco da aprendizagem e a necessidade de prestar atenção aos pequenos detalhes