Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.11.26;
Скачать: CL | DM;

Вниз

передача файлов по сети   Найти похожие ветки 

 
Zhekacoder   (2006-05-08 22:59) [0]

Как передать файл по сети с помощью TCPServer и TCPClient?


 
XProger ©   (2006-05-09 00:23) [1]

пакетами


 
Zhekacoder   (2006-05-09 07:38) [2]

Я спрашиваю не чем, а как?

Хотелось бы рабочий код, я делаю так: отсылаю поток из клиента серверу, как мне его сервером принять, какую функцию использовать?


 
Лев   (2006-05-09 13:18) [3]

На счет TCPServer и TCPClient не знаю - не работал, а вот на 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.


 
Zhekacoder   (2006-05-09 18:16) [4]

Спасиб большое! Буду рабатать дальше


 
PATRIOT ©   (2006-07-05 01:17) [5]

а как сделать так чтобы прочитать хидер (тело) файла и уже самим его отправить?

p.s. просто у тебя в примере ты отправляешь картинку уже впаяную в TImage.


 
medved_68 ©   (2006-07-05 10:55) [6]


> PATRIOT


> а как сделать так чтобы прочитать хидер (тело) файла и уже
> самим его отправить?


Var
Potok:=TFileStream;Potok1:TMemoryStream;Saze:Int64;T:Boolean;
begin
Potok:=TFileStream.Create("Путь к твоему файлу",fmOpenRead);
Potok1:=TMemoryStream.Create;
Saze:=Potok.Size;
Potok1.WriteBuffer(Saze,8);
Potok1.CopyFrom(Potok,Potok.Size);
Potok.Free;
Potok1.Position:=0;
t:=ServerSocket1.Socket.Connection[0].SendStream(Potok1);
If t then showmessage("Sending OK!")
 else showmessage("Sending ERROR!");



Страницы: 1 вся ветка

Текущий архив: 2006.11.26;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.035 c
15-1162848484
Bogdan1024
2006-11-07 00:28
2006.11.26
Как посмотреть pdf?


2-1163061812
yyy111
2006-11-09 11:43
2006.11.26
for i := ...


2-1162927063
Ingwar
2006-11-07 22:17
2006.11.26
уж точно вопрос начинающего =)


8-1145261176
TRyaSS
2006-04-17 12:06
2006.11.26
Кто знает, подскажите плз, каким образом можно кривые хранить?


15-1162570220
{---}
2006-11-03 19:10
2006.11.26
Популярный софт на delphi.