Как передать файл по Tcp

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by ronald, 21 Sep 2008.

  1. ronald

    ronald Elder - Старейшина

    Joined:
    27 Mar 2008
    Messages:
    252
    Likes Received:
    41
    Reputations:
    6
    Всем привет!

    Взял я из книги фленова Udp-чат и чуть-чуть модифнул, а вот какая бяка получается:
    нужно передавать файлы в чате, но почитав, я въехал, что Udp медленней Tcp
    прошу помощи вот в чём:
    нужно чтобы при нажатии на кнопку выходил лист с директориями, в которых можно выбрать файл и отправить ссылку на него, чтобы сообщение выглядело к примеру так:
    "Андрюха, при! вот документ: ССЫЛКА НА СЛИВ ФАЙЛА c компа в локалке"
    также в локальной сети есть комп, раздающий вай-фай, т.е. его можно использовать как временное хранилище файлов для передачи
     
    #1 ronald, 21 Sep 2008
    Last edited: 21 Sep 2008
  2. Zabuldon

    Zabuldon Elder - Старейшина

    Joined:
    6 Apr 2008
    Messages:
    99
    Likes Received:
    6
    Reputations:
    0
    не вижу проблемы... используешь диалог типа fileopen, сохрани путь к файлу потом сделай temp директорию на том компе (убедившись что права доступа есть), скопируй туда файл, затем выдай ссылку типа 172.12.12.12/temp/имя файла и все... но есть способы намного проще... юзай сокеты...

    вот пример...


    Обработчик для клиента:



    var
    MyStream: TMemoryStream;
    begin
    MyStream := TMemoryStream.Create;
    MyStream.LoadFromFile('c:\windows\рабочий стол\DelphiWorld.txt');
    NMStrm1.PostIt(MyStream);
    MyStream.Free;
    end;




    Обработчик для сервера:



    procedure TForm1.NMStrmServ1MSG(Sender: TComponent;
    const sFrom: string; strm: TStream);
    var
    MyStream: TMemoryStream;
    begin
    MyStream := TMemoryStream.Create;
    MyStream.CopyFrom(strm, NMStrmServ1.BytesTotal);
    MyStream.SaveToFile('c:\windows\рабочий стол\DelphiWorld2.txt');
    end;

    Пример взят из Delphi World
     
    #2 Zabuldon, 21 Sep 2008
    Last edited: 21 Sep 2008
  3. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    ээээ.... Как раз таки наоборот =\
    TCP медленее UDP...
    ну ты крут, слушай, wi-fi... ссылки...
    для начала:
    OpenFileDialog - Диалог для выбора файла. Метод Execute откроет диалог. Пример:
    По поводу передачи файлов:
    http://www.hostmake.ru/articles/delphi/384/
    www.delphisources.ru/pages/faq/internet_net.html
    http://www.cyberforum.ru/delphi/thread8742.html
    http://fssr.ru/hz.php?name=Forums&file=viewtopic&t=20820
     
  4. Zabuldon

    Zabuldon Elder - Старейшина

    Joined:
    6 Apr 2008
    Messages:
    99
    Likes Received:
    6
    Reputations:
    0
    Ну зачем так жестко =)) судя по всему просто человек был дезинформирован =)

    З.Ы. вот еще пример с сокетами:


    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, ScktComp, StdCtrls;

    type
    TForm1 = class(TForm)
    ClientSocket1: TClientSocket;
    ServerSocket1: TServerSocket;
    btnTestSockets: TButton;
    procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure ClientSocket1Disconnect(Sender: TObject;
    Socket: TCustomWinSocket);
    procedure ClientSocket1Connect(Sender: TObject;
    Socket: TCustomWinSocket);
    procedure ServerSocket1ClientConnect(Sender: TObject;
    Socket: TCustomWinSocket);
    procedure btnTestSocketsClick(Sender: TObject);
    private
    FStream: TFileStream;
    { Private-Deklarationen }
    public
    { Public-Deklarationen }
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure TForm1.ClientSocket1Read(Sender: TObject;
    Socket: TCustomWinSocket);
    var
    iLen: Integer;
    Bfr: Pointer;
    begin
    iLen := Socket.ReceiveLength;
    GetMem(Bfr, iLen);
    try
    Socket.ReceiveBuf(Bfr^, iLen);
    FStream.Write(Bfr^, iLen);
    finally
    FreeMem(Bfr);
    end;
    end;

    procedure TForm1.FormCreate(Sender: TObject);
    begin
    FStream := nil;
    end;

    procedure TForm1.FormDestroy(Sender: TObject);
    begin
    if Assigned(FStream) then
    begin
    FStream.Free;
    FStream := nil;
    end;
    end;

    procedure TForm1.ClientSocket1Disconnect(Sender: TObject;
    Socket: TCustomWinSocket);
    begin
    if Assigned(FStream) then
    begin
    FStream.Free;
    FStream := nil;
    end;
    end;

    procedure TForm1.ClientSocket1Connect(Sender: TObject;
    Socket: TCustomWinSocket);
    begin
    FStream := TFileStream.Create('c:\temp\test.stream.html', fmCreate or fmShareDenyWrite);
    end;

    procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
    Socket: TCustomWinSocket);
    begin
    Socket.SendStream(TFileStream.Create('c:\temp\test.html', fmOpenRead or fmShareDenyWrite));
    end;

    procedure TForm1.btnTestSocketsClick(Sender: TObject);
    begin
    ServerSocket1.Active := True;
    ClientSocket1.Active := True;
    end;

    end.
     
    #4 Zabuldon, 21 Sep 2008
    Last edited: 21 Sep 2008
  5. BrainDeaD

    BrainDeaD Elder - Старейшина

    Joined:
    9 Jun 2005
    Messages:
    774
    Likes Received:
    292
    Reputations:
    214
    с каких это пор? в Udp нет проверки ошибок => он быстрее.
     
    1 person likes this.
  6. ronald

    ronald Elder - Старейшина

    Joined:
    27 Mar 2008
    Messages:
    252
    Likes Received:
    41
    Reputations:
    6
    ок, Tcp медленней Udp , пойду запомню...
     
  7. Zabuldon

    Zabuldon Elder - Старейшина

    Joined:
    6 Apr 2008
    Messages:
    99
    Likes Received:
    6
    Reputations:
    0
    На самом деле они правы UDP пакет устроен проще на его разбор меньше времени уходит
     
  8. ronald

    ronald Elder - Старейшина

    Joined:
    27 Mar 2008
    Messages:
    252
    Likes Received:
    41
    Reputations:
    6
    скорей всего меня здесь неправильно поняли т.к.:
    Я имел ввиду, что это чат, а не по типу аськи, когда идёт личная беседа
    В каждом клиенте стоит и клиент и серверный компонент UDP, для отправки текста, а слить файл должны мочь(корявый йазык :D ) все компыЮ но при желании человека, а оно должно выражаться кликом по ссылке))
     
    #8 ronald, 21 Sep 2008
    Last edited: 21 Sep 2008
  9. Zabuldon

    Zabuldon Elder - Старейшина

    Joined:
    6 Apr 2008
    Messages:
    99
    Likes Received:
    6
    Reputations:
    0
    Мой тебе совет используй сокеты... это намного проще и удобнее а поняли тебя правильно... в любом случае UDP выигрывает
     
  10. fry

    fry Elder - Старейшина

    Joined:
    7 Mar 2008
    Messages:
    25
    Likes Received:
    2
    Reputations:
    0
    ни Udp ни Tcp быстрей они все медленые если ваш инет не от билайн :)

    Udp шлёт пакеты. Но делаеть их размеров в файл не стоит. Если ты будешь слать файл разбив на пакеты, то не факт, что ты их всегда будешь получать в правильной очерёдности. И хоть УДП гарантирует доставку. но пакеты могут пропадать.

    На этом фоне ТСП проще. Но у УДП есть большое примущество. УДП может преодоевать НАТ который стоит и получателя и отправителя.

    А ТСП не может.

    Если ты делаешь п2п чат. то УДП гораздо лучше. как раз поэтому скайп использует УДП.
     
  11. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    мдаа...

    вобщем так, насколько я знаю:
    udp
    Быстрый за счет того что не требует ответа от получателя, преодалевает Nat
    tcp
    Медленный, но надежный. Требует ответ от получателя. К примеру от программы А уходит пакет к программе Б, программа А не пошлет очередной пакет, до тех пор, пока программа Б, не вернет ответ что все ОК, если же не ОК, пакет отправится снова.

    Upd целесобразно применять для мультимедии, голосовая передача, вэб камера и т.п. Но передавать бинарные файлы с помощью Upd не советую
     
  12. De-visible

    De-visible [NDC] Network develope c0ders

    Joined:
    6 Jan 2008
    Messages:
    916
    Likes Received:
    550
    Reputations:
    66
    Оффтоп, пошел спор, прекращаем, для выбора файла используй OpenDialog как тебе сказал WiZard, для передачи, лучше вообще используй сокеты.
     
    1 person likes this.