Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Передача файлов


Vendict ©   (2008-01-12 11:04:00) 

Поиск по сабжу отдаёт исходники для 6й Delphi. нужно примерчик для 7й.
где только не искал, всё 6я ..


Сергей М.   (2008-01-13 18:52:00) [1]


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


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

Ты научись сначала надежной доставке данных, а уж потом будешь эти данные кодировать


DVM   (2008-01-13 14:31:00) [2]


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

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


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

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

Примеры Indy?, ICS посмотри.


Vendict   (2008-01-12 22:45:00) [3]

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


Сергей М.   (2008-01-12 17:17:00) [4]

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


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


Клиент не смог подключиться к серверу - на интересующем клиента хосте/порту нет активного сервера.


Vendict   (2008-01-12 17:11:00) [5]

продолжаем...

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". в чём проблема ?


Сергей М.   (2008-01-12 16:53:00) [6]


> TNMStrmServ TNMStrm TNMMsg


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


> TClientSocketT ServerSocket


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

Просто установи этот пакет и компоненты появятся в палитре


Vendict   (2008-01-12 16:45:00) [7]

TNMStrmServ
TNMStrm
TNMMsg
TClientSocket
TServerSocket


Сергей М.   (2008-01-12 16:37:00) [8]


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


Какие конкретно ?


Vendict   (2008-01-12 14:32:00) [9]

так те исходники используют компоненты, которых в 7й не наблюдается.
нужна реализация для 7й Delphi.


DVM   (2008-01-12 14:21:00) [10]

в чем вопрос?


Наверх

Титульная страница Поиск, карта сайта Написать письмо