Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 15, 2009 20:16:36

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

через XML-RPC можно передавать файлы бльших размеров?

сабж
файлы 100Мб..20Гб

Отредактировано (Дек. 15, 2009 20:18:54)

Офлайн

#2 Дек. 15, 2009 21:04:40

slav0nic
Команда
От: dp.ua
Зарегистрирован: 2006-05-07
Сообщения: 2260
Репутация: +  41  -
Профиль   Отправить e-mail  

через XML-RPC можно передавать файлы бльших размеров?

можно, но думаю не нужно) не думаю что SimpleXMLRPCServer пишет что-то на диск во временный каталог, небось всё в озу держит

Офлайн

#3 Дек. 15, 2009 21:27:50

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

через XML-RPC можно передавать файлы бльших размеров?

Даже если взять/создать реализацию протокола без ограничений по памяти - отсутствие докачки убьет идею на взлете.
К тому же не могу представить случай, где нужно проталкивать что-то гигабайтное через протокол передачи синхронных сообщений.



Офлайн

#4 Дек. 15, 2009 21:57:49

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

через XML-RPC можно передавать файлы бльших размеров?

Я где-то что-то на эту тему встречал. Там как раз была реализация с передачей кусками и с докачкой.
Могу порыться в закромах, если надо.



Офлайн

#5 Дек. 16, 2009 05:28:43

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

через XML-RPC можно передавать файлы бльших размеров?

нашел в документации передачу файла от сервера клиенту, тут он сразу пишет в файл не накапливая в памяти

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)

Офлайн

#6 Дек. 16, 2009 05:33:55

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

через XML-RPC можно передавать файлы бльших размеров?

Андрей Светлов
Даже если взять/создать реализацию протокола без ограничений по памяти - отсутствие докачки убьет идею на взлете.
К тому же не могу представить случай, где нужно проталкивать что-то гигабайтное через протокол передачи синхронных сообщений.
мне для работы в локалке, возможно придется автоматизировать передачу толстых бекапов с хоста на хост.

а в стандартной поставке питона есть что-то для передачи толстых файлов?
сейчас делаю на сокетах

Офлайн

#7 Дек. 16, 2009 11:56:03

cybergrind
От:
Зарегистрирован: 2008-01-21
Сообщения: 201
Репутация: +  0  -
Профиль   Отправить e-mail  

через XML-RPC можно передавать файлы бльших размеров?

а чем плох какойнибудь nginx/apache/lighttpd + wget?

если нужен именно питон, можно конечно реализовать свой простейший протокол для передачи кусками.
чтото типа такого: http://sooda.dy.fi/ohjelmat/?id=SSFT



Отредактировано (Дек. 16, 2009 12:02:20)

Офлайн

#8 Дек. 16, 2009 12:22:15

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

через XML-RPC можно передавать файлы бльших размеров?

Я бы предложил ftp или tftp… ИМХО, они для этого и созданы.



Офлайн

#9 Дек. 16, 2009 12:47:07

evgenyl
От:
Зарегистрирован: 2008-07-22
Сообщения: 148
Репутация: +  0  -
Профиль   Отправить e-mail  

через XML-RPC можно передавать файлы бльших размеров?

на asyncore/asynchat думаю свой FTP не проблема написать, возможно таких поделок полно в нете



Офлайн

#10 Дек. 16, 2009 13:56:21

evgenyl
От:
Зарегистрирован: 2008-07-22
Сообщения: 148
Репутация: +  0  -
Профиль   Отправить e-mail  

через XML-RPC можно передавать файлы бльших размеров?

вот набросал побыстрому от безделия

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()
client.py - передает файл серверу
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)



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version