На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Rouse_, jack128, Krid
  
    > Простой способ отправки файлов , с помощью TClientSocket & TServerSocket

      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.

      Автор М.К.

      Оригинал: http://www.delphimaster.ru/cgi-bin/faq.pl?...=991237103&n=20
      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0,0134 ]   [ 16 queries used ]   [ Generated: 27.04.24, 15:15 GMT ]