Как отправить / получить файл данных через сокет? - PullRequest
0 голосов
/ 09 июля 2011

Я пишу сокет программирования с Python для отправки / получения файла по TCP.

Пока я отправлял / получал данные, я понял, что они не отправили и не получили часть файлов.

Здесь часть для отправки части данных в зависимости от размера буфера.

  msg[i] = file[i].read()
  file[i].close()
  while 1:
     tdata[i], msg[i] = msg[i][:buf], msg[i][buf:]
     c.send(tdata[i])

     if len(msg[i]) < buf:
        break 

Пожалуйста, помогите мне, как полностью отправить / получить данные.

Ответы [ 2 ]

3 голосов
/ 09 июля 2011

Остановка отправки при len(msg[i]) < buf, поэтому конец данных может отсутствовать.

Если вы хотите отправить все сообщения [i], лучше сделать:

while msg[i]:
    tdata[i], msg[i] = msg[i][:buf], msg[i][buf:]
    c.sendall(tdata[i])

или просто отправьте его за один раз:

c.sendall(msg[i])

Обратите внимание, что send() вернет, сколько фактически было отправлено байтов (потому что это не обязательно отправит их все), поэтому, если вы хотите отправить все (как это обычно бывает), используйте sendall(). 1012 *

0 голосов
/ 22 июня 2013

Я бы попробовал что-то вроде этого:

import shutil

shutil.copyfileobj(open('data'), c.makefile('wb'))

Вот как это делает модуль SimpleHTTPServer.

...