Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Помогите!


Автор: The MASTER 21.8.2004, 21:10
Помогите срочно, sample.gif по отсылке файлов по сети!

Автор: Alex 21.8.2004, 21:21
На вопрос "Как я могу отправлять файлы через TClientSocket & TServerSocket?" даём наш ответ smile.gif

Код
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.


Взято с Исходников.ru http://www.sources.ru

Автор: The MASTER 23.8.2004, 14:39
Вообще-то это отсылка битмапов! sad.gif

Автор: Vit 23.8.2004, 15:43
Тема закрыта! Научитись формулировать назнание темы правильно! Тут все хотят получить помощь

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)