проблемы с отправкой изображения с клиента на сервер - PullRequest
1 голос
/ 17 июля 2010

Я пытаюсь отправить изображение из 'C: \ picture.bmp' в 'c: \ temp \ picture.bmp', используя обработчик событий onconnect клиентов сервера и клиентского сокета следующим образом:1003 * и серверы onclientread as:

procedure TForm2.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  fmm : tfilestream;
  iLen: Integer;
    Bfr: Pointer;
  begin

     iLen := Socket.ReceiveLength;
  GetMem(Bfr, iLen);
  fmm := TFileStream.Create('c:\temp\picture.bmp', fmCreate or 

fmShareDenyWrite);
  try
    Socket.ReceiveBuf(Bfr^, iLen);
    fmm.Write(Bfr^, iLen);
  finally
    FreeMem(Bfr);
    fmm.Free;
  end;

end;

картинка получена / создана, но повреждена или не была получена, т.е. создана из-за метода tfilestream.create?пожалуйста помогите! что я делаю не так?

Ответы [ 2 ]

1 голос
/ 17 июля 2010

Несмотря на свое имя, SendStream () НЕ гарантирует отправку всего потока (особенно, если вы используете неблокирующий сокет).Его возвращаемое значение возвращает сколько байтов фактически отправлено.Если за один вызов отправляется поток меньшего размера, вам придется снова вызывать SendStream (), возможно, много раз, чтобы завершить отправку всего потока (такие же проблемы существуют и с SendText ()).

С другой стороны, ReceiveLength () сообщает только, сколько байтов доступно в сокете НА ЭТОМ МОМЕНТЕ.Вероятно, это меньше, чем полный отправляемый поток (аналогично, ReceiveText () может не получить полную отправленную строку либо потому, что он использует ReceiveLength () внутри).

Лучший способ отправить поток (илилюбые произвольные данные в общем) - сначала отправлять размер данных, а затем отправлять фактические данные.Продолжайте вызывать SendBuf / Stream / Text () до тех пор, пока не будет достигнут этот размер (если -1 возвращается неблокирующим сокетом, не вызывая исключение, вы должны ждать, пока событие OnWrite сокета не сработает, прежде чем сокет снова сможет принимать больше данных).На приемном конце сначала прочитайте размер, затем продолжайте чтение, пока не будет достигнут указанный размер.Возможно, вам придется прочитать при множественном запуске события OnRead, прежде чем вы получите все данные.

Перейдите к http://www.deja.com и http://forums.embarcadero.com, чтобы найти группу новостей Borland / CodeGear / Embarcadero/ Архив форума.Я опубликовал пример кода много раз прежде.

1 голос
/ 17 июля 2010

Я не знаю, что не так, но я бы попытался устранить более простую проблему.т.е. ты можешь даже передать что-то простое?Посмотрите, можете ли вы передать файл c: \ hello.txt, содержащий только «Hello», и получить его в правильном порядке.Должно быть проще изучить поток и полученный файл, чтобы увидеть, если / где что-то искажается.Если вы не получили «Hello» на сервере, то знаете, что это не имеет никакого отношения к размеру или сложности данных.

...