2015-06-26 3 views
0

Я пытаюсь отправить файлы (изображения и текст) сокетами в python. Я не хочу создавать новое соединение каждый раз, потому что код записывает много файлов (> 100) за короткий промежуток времени, поэтому я не хочу создавать много соединений, пока они ждут закрытия. Поэтому перед отправкой каждого фрагмента файла я отправляю сначала длину куска. Когда я запускаю его, он дает мне ValueError на length = int(s.recv(4)), показывая строку из файла и говоря, что он не может быть преобразован в int. Вот часть моего кода, который отправляет и получает один файл: Отправка:Отправка нескольких файлов по одному сокету в python

#Connect s and open file f 
s.setblocking(1) 
buf = 4096 
while True: 
    msg = f.read(buf) 
    length = str(len(msg)) 
    if len(length) < 4: length = "0"*(4-len(length)) + length 

    s.sendall(length) 
    if length == "0000": break 
    s.sendall(msg) 
    if len(msg) != buf: break 

Принимающий:

#Connect s and open file f 
while True: 
    length = int(s.recv(4)) 
    if length == 0: break 

    f.write(s.recv(length)) 
    if length < buf: break 

Запуск на Windows 8.

+0

используйте 'socket.htonl' и' socket.ntohl' и отправьте его как двоичный. –

+0

Не могли бы вы рассказать об этом? – Kieran

+0

Почему не удалось использовать ftp или sftp? –

ответ

0

Если вы отправляете большие файлы (в зависимости на вашем маршрутизаторе), маршрутизатор может разбить пакеты на более короткие, заставляя вас случайно попытаться получить длину куска, пока не получает весь более ранний файл. Вы должны убедиться, что с циклом while вы получите всю длину данных, если не продолжать запрашивать данные с помощью s.recv (length-len (what_i_got_so_far)).

Пример, когда я отправляю себе несколько изображений MB через LAN, маршрутизатор разрезает пакеты примерно до 25 КБ, поэтому я должен использовать recv много раз, хотя я использовал только 1 отправку.

Надеюсь, это поможет.

Смежные вопросы