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

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Диктор новостей: «…Из Баку сообщают о разработке нового стандарта для локальных компьютерных сетей — 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.

{/codecitation}

Добавить комментарий