Форум сайта python.su
сабж
файлы 100Мб..20Гб
Отредактировано (Дек. 15, 2009 20:18:54)
Офлайн
можно, но думаю не нужно) не думаю что SimpleXMLRPCServer пишет что-то на диск во временный каталог, небось всё в озу держит
Офлайн
Даже если взять/создать реализацию протокола без ограничений по памяти - отсутствие докачки убьет идею на взлете.
К тому же не могу представить случай, где нужно проталкивать что-то гигабайтное через протокол передачи синхронных сообщений.
Офлайн
Я где-то что-то на эту тему встречал. Там как раз была реализация с передачей кусками и с докачкой.
Могу порыться в закромах, если надо.
Офлайн
нашел в документации передачу файла от сервера клиенту, тут он сразу пишет в файл не накапливая в памяти
from SimpleXMLRPCServer import SimpleXMLRPCServer
import xmlrpclib
def python_logo():
with open("python_logo.jpg") as handle:
return xmlrpclib.Binary(handle.read())
server = SimpleXMLRPCServer(("localhost", 8000))
print "Listening on port 8000..."
server.register_function(python_logo, 'python_logo')
server.serve_forever()
import xmlrpclib
proxy = xmlrpclib.ServerProxy("http://localhost:8000/")
with open("fetched_python_logo.jpg", "w") as handle:
handle.write(proxy.python_logo().data)
Офлайн
Андрей Светловмне для работы в локалке, возможно придется автоматизировать передачу толстых бекапов с хоста на хост.
Даже если взять/создать реализацию протокола без ограничений по памяти - отсутствие докачки убьет идею на взлете.
К тому же не могу представить случай, где нужно проталкивать что-то гигабайтное через протокол передачи синхронных сообщений.
Офлайн
а чем плох какойнибудь nginx/apache/lighttpd + wget?
если нужен именно питон, можно конечно реализовать свой простейший протокол для передачи кусками.
чтото типа такого: http://sooda.dy.fi/ohjelmat/?id=SSFT
Отредактировано (Дек. 16, 2009 12:02:20)
Офлайн
Я бы предложил ftp или tftp… ИМХО, они для этого и созданы.
Офлайн
на asyncore/asynchat думаю свой FTP не проблема написать, возможно таких поделок полно в нете
Офлайн
вот набросал побыстрому от безделия
server.py - принимает файлы
import asyncore
from struct import pack,unpack
import socket
TRANSFER_BUF_SIZE=1024*8
class Transfer(asyncore.dispatcher):
def __init__(self,sock,host):
asyncore.dispatcher.__init__(self,sock)
self.mode='head'
def handle_read(self):
if self.mode=='head':
try:
head_size=unpack('=H',self.recv(2))[0]
self.file_size, file_name=unpack('=Q%ss' % (head_size-8), self.recv(head_size))
self.file=open(file_name,'wb')
self.mode='data'
self.recived=0
except Exception, e:
print 'Bad head',e
self.close()
else:
buf=self.recv(TRANSFER_BUF_SIZE)
self.recived+=len(buf)
self.file.write(buf)
if self.recived==self.file_size:
self.close()
class TransferServer(asyncore.dispatcher):
def __init__(self, port=3333):
asyncore.dispatcher.__init__(self)
self.port = port
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
self.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.bind(("", port))
self.listen(5)
print 'server listed on %s port' % port
def handle_accept(self):
Transfer(*self.accept())
server=TransferServer()
asyncore.loop()
from struct import pack,unpack
import socket
from os.path import getsize
TRANSFER_BUF_SIZE=1024*8
fn='2.tgz'
rfn='1.tgz'
head=pack('=Q%ss' % len(rfn), getsize(fn), rfn )
file=open(fn)
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect( ('127.0.0.1', 3333) )
s.send(pack('=H',len(head)))
s.send(head)
while 1:
buf=file.read(TRANSFER_BUF_SIZE)
if buf=='': break
s.send(buf)
Офлайн