Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2006.11.26;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.038 c
11-1139138056
denis111
2006-02-05 14:14
2006.11.26
Цвет шрифта формы KOLForm1 не меняется в object inspector


15-1162915760
xazan
2006-11-07 19:09
2006.11.26
Экспертные системы


15-1163141822
StriderMan
2006-11-10 09:57
2006.11.26
Наследование в БД


15-1163011947
AntiUser
2006-11-08 21:52
2006.11.26
Самые опасные порты?


2-1163075261
Choco
2006-11-09 15:27
2006.11.26
Dll которая возвращает массив





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский