Компьютерный форум NoWa.cc

Компьютерный форум NoWa.cc (https://nowa.cc/index.php)
-   Delphi (https://nowa.cc/forumdisplay.php?f=300)
-   -   Обмен файлами через TCP протокол (https://nowa.cc/showthread.php?t=135683)

XStreaM 30.12.2007 02:09

Обмен файлами через TCP протокол
 
Помогите разобраться и сделать что-то подобное:

http://www.delphisources.ru/pages/fa...send_data.html

Как мне переделать пример под протокол TCP, желательно с помощью TIdTCPServer и TIdTCPClient! :)

Заранее СПАСИБО!!!

Testudo 02.01.2008 17:18

Ответ: Обмен файлами через TCP протокол
 
Оба этих компонента умеют посылать потоки (stream). Все что нужно, это создать TFileStream от нужного файла, и отправить созданный поток.
С другой стороны примерно так же - создается файловый поток (на новый файл), и в него принимаются данные.

XStreaM 08.01.2008 17:15

Ответ: Обмен файлами через TCP протокол
 
Да я это знаю, в принципе я так и хочу.
У меня получилось только на TClientSocket и TServerSocket
  1. Сервер создает поток TFileStream.Create('c:\1.avi', fmOpenRead or fmShareDenyWrite);
  2. Клиент отправляет сообщение о готовности принять файл
  3. Сервер отравляет «Заголовок» (Кодовое слово, Имя файла, Размер файла)
  4. Клиент создает файл у себя TFileStream.Create(SaveDialog1.FileName, fmCreate or fmShareDenyWrite);
  5. Сервер пакетами отправляет файловый поток [для того чтобы видеть в TGauge сколько было передано и осталось я изменил функцию TCustomWinSocket.SendStreamPiece под себя]
  6. Клиенту проще [знаем размер файла и сколько байт передано в буфере] каждое сообщение обрабатывает OnRead, просто напросто дописываем в конец файлового потока и отображаем в TGauge.

Как уловить это в упомянутые TIdTCPServer и TIdTCPClient не знаю. SOS!!! Очень нужно... :(

phat 11.01.2008 10:31

Ответ: Обмен файлами через TCP протокол
 
Клиент:
Код:

    assignfile(f,extractfilename(a));
    rewrite(f);

        siz:= strtoint(form1.tcp.ReadLn(''));
        form1.tcp.ReadBuffer(buff,siz);
        blockwrite(f,buff,siz);
        inc(currblk);
    while siz=8192 do begin
        siz:= strtoint(form1.tcp.ReadLn(''));
        form1.tcp.ReadBuffer(buff,siz);
        inc(currblk);
        blockwrite(f,buff,siz);
        if round((currblk / blocks)*100)<>cents then begin
          form1.conO.Lines[form1.conO.Lines.Count-1]:=inttostr(cents)+' % Completed';
          cents:=round((currblk / blocks)*100);
        end;
        application.ProcessMessages;
    end;
    closefile(f);
    form1.conO.Lines.Add('Transfer complete!!!');

Сервер:
Код:

    AssignFile(F, path);
    {$I-}
    Reset(F);
    {$I+}
    if IOResult = 0 then
    begin
      Sock.sendstring('Starting transfer...'#13#10);
      sock.SendString(inttostr(filesize(f)div 8192)+#13#10);
      numreaded:=8192;
      while numreaded=8192 do begin
        Blockread(f, Buff, 8192, NumReaded);
        sock.SendString(inttostr(numreaded)+#13#10);
        sock.SendBuffer(@buff,numreaded);
      end;
      CloseFile(F);
    end else  Sock.sendstring('File '+path+' not found!'#13#10);



Текущее время: 21:55. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2026, vBulletin Solutions, Inc. Перевод: zCarot
Copyright ©2004 - 2026 NoWa.cc

Время генерации страницы 0.03081 секунды с 9 запросами