Конференция "Сети" » Передача файлов
 
  • Vendict © (12.01.08 11:04) [0]
    Поиск по сабжу отдаёт исходники для 6й Delphi. нужно примерчик для 7й.
    где только не искал, всё 6я ..
  • DVM © (12.01.08 14:21) [1]
    в чем вопрос?
  • Vendict © (12.01.08 14:32) [2]
    так те исходники используют компоненты, которых в 7й не наблюдается.
    нужна реализация для 7й Delphi.
  • Сергей М. © (12.01.08 16:37) [3]

    >  компоненты, которых в 7й не наблюдается.


    Какие конкретно ?
  • Vendict © (12.01.08 16:45) [4]
    TNMStrmServ
    TNMStrm
    TNMMsg
    TClientSocket
    TServerSocket
  • Сергей М. © (12.01.08 16:53) [5]

    > TNMStrmServ TNMStrm TNMMsg


    Использовать эти компоненты не рекомендуется вообще.


    > TClientSocketT ServerSocket


    А эти лежат в пакете ($DELPHI)\BIN\dclsockets.bpl

    Просто установи этот пакет и компоненты появятся в палитре
  • Vendict © (12.01.08 17:11) [6]
    продолжаем...

    unit Unit1;

    interface

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

    type
     TForm1 = class(TForm)
       Image1: TImage;
       Image2: TImage;
       ClientSocket1: TClientSocket;
       ServerSocket1: TServerSocket;
       Button1: TButton;
       procedure Image1Click(Sender: TObject);
       procedure FormCreate(Sender: TObject);
       procedure ClientSocket1Connect(Sender: TObject;
         Socket: TCustomWinSocket);
       procedure ServerSocket1ClientRead(Sender: TObject;
         Socket: TCustomWinSocket);
       procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
     private
       { Private declarations }
       Reciving: boolean;
       DataSize: integer;
       Data: TMemoryStream;
     public
       { Public declarations }
     end;

    var
     Form1: TForm1;

    implementation

    {$R *.DFM}

    procedure TForm1.Image1Click(Sender: TObject);
    begin
     // Это процедура для открытия сокета на ПРИЁМ (RECEIVING).
     // Button1.Click is this procedure as well.
     ClientSocket1.Active:= true;
    end;

    procedure TForm1.FormCreate(Sender: TObject);
    begin
     // Открытие ОТПРАВЛЯЮЩЕГО (SENDING) сокета.
     ServerSocket1.Active:= true;
    end;

    procedure TForm1.ClientSocket1Connect(Sender: TObject;
     Socket: TCustomWinSocket);
    begin
     // Посылаем команду для начала передачи файла.
     Socket.SendText('send');
    end;

    procedure TForm1.ClientSocket1Read(Sender: TObject;
     Socket: TCustomWinSocket);
    var
     s, sl: string;
    begin
     s:= Socket.ReceiveText;
     // Если мы не в режиме приёма:
     if not Reciving then
     begin
       // Теперь нам необходимо получить длину потока данных.
       SetLength(sl, StrLen(PChar(s))+1); // +1 for the null terminator
       StrLCopy(@sl[1], PChar(s), Length(sl)-1);
       DataSize:= StrToInt(sl);
       Data:= TMemoryStream.Create;
       // Удаляем информацию о размере из данных.
       Delete(s, 1, Length(sl));
       Reciving:= true;
     end;
     // Сохраняем данные в файл, до тех пор, пока не получим все данные.
     try
       Data.Write(s[1], length(s));
       if Data.Size = DataSize then
       begin
         Data.Position:= 0;
         Image2.Picture.Bitmap.LoadFromStream(Data);
         Data.Free;
         Reciving:= false;
         Socket.Close;
       end;
     except
       Data.Free;
     end;
    end;

    procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
     Socket: TCustomWinSocket);
    var
     ms: TMemoryStream;
    begin
     // Клиент получает команду на передачу файла.
     if Socket.ReceiveText = 'send' then
     begin
       ms:= TMemoryStream.Create;
       try
         // Получаем данные на передачу.
         Image1.Picture.Bitmap.SaveToStream(ms);
         ms.Position:= 0;
         // Добавляем длину данных, чтобы клиент знал, сколько данных будет передано
         // Добавляем #0 , чтобы можно было определить, где заканчивается информация о размере.
         Socket.SendText(IntToStr(ms.Size) + #0);
         // Посылаем его.
         Socket.SendStream(ms);
       except
         // Итак, осталось освободить поток, если что-то не так.
         ms.Free;
       end;
     end;
    end;

    end.



    выдаёт "Asynchrous socket error 10061". в чём проблема ?
  • Сергей М. © (12.01.08 17:17) [7]
    Пример хоть и популярный, но крайне неудачный.
    В условиях глоб.сети надежно работать он попросту не будет.


    > выдаёт "Asynchrous socket error 10061". в чём проблема ?


    Клиент не смог подключиться к серверу - на интересующем клиента хосте/порту нет активного сервера.
  • Vendict © (12.01.08 22:45) [8]
    а какой пример стоит использовать ?
    Base64 кодирование ? ведь должен же быть способ более проще..
  • DVM © (13.01.08 14:31) [9]

    > а какой пример стоит использовать ?

    Тот который не от TNM....


    > Base64 кодирование ? ведь должен же быть способ более проще.
    > .

    А причем тут вообще Base64 ?

    Примеры Indy?, ICS посмотри.
  • Сергей М. © (13.01.08 18:52) [10]

    > Base64 кодирование ?


    Какое еще нафих "кодирование", если даже с транспортом у тебя полная непонятка ?

    Ты научись сначала надежной доставке данных, а уж потом будешь эти данные кодировать
 
Конференция "Сети" » Передача файлов
Есть новые Нет новых   [134431   +15][b:0][p:0.003]