Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

Курс видеоуроков «Программирование и взлом 2O18»
Выпущен 13 августа 2O18 года
Свежие инструменты, новые видеоуроки!

  • 300+ видеоуроков
  • 800 инструментов
  • 100+ свежих книг и статей

УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

БОЛЬШОЙ FAQ ПО DELPHI



Простой способ отправки файлов при помощи TClientSocket и TServerSocket

Диктор новостей: "...Из Баку сообщают о разработке нового стандарта для локальных компьютерных сетей - Azernet".


 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.
 




<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ



Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS