Суббота, 18.05.2024
Королевство Delphi
Главное меню
Статьи
Наш опрос
Нравится раздел статьи?
Всего ответов: 68
Статистика
Онлайн всего: 1
Гостей: 1
Пользователей: 0
Форма входа
Главная » Статьи » Сеть-интернет » Разные

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

На вопрос "Как я могу отправлять файлы через 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.

Автор: M K

Получить ссылку на материал

Категория: Разные | Добавил: Барон (14.12.2011)
Просмотров: 897 | Теги: TServerSocket, TClientSocket | Рейтинг: 0.0/0
[ Пожертвования для сайта ] [ Пожаловаться на материал ]

Если вам помог материал сайта кликните по оплаченной рекламе размещенной в центре

Поиск
Категории раздела
Web-приложения [6]
Почта [12]
Работа с HTTP [4]
Робота с XML [4]
Сервер [3]
Разные [50]
Королевство Delphi © 2010-2024
Яндекс цитирования