самое простое - это с помощью
IdTCPServer...
Сначала надо определиться с форматом передачи данных.
Пусть у нас сначала будет передаваться имя файла, в формате pchar (c замыкающим нулем) длинной 256 байт.
Потом передается размер файла. целое число типа Cardinal (DWORD)
Потом поток данных самого файла.
Создаем новую форму, кладем на неё IdTCPServer, в строке bind указываем, какие адреса и порты он будет "слушать".
Ставим ему Active := True (пусть работает все время, когда программа запущена). И в Events на onConnect пишем следующее:
Код: Выделить всё
procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
var
FileToSend: String;
FileSize: Cardinal;
p: Pointer;
begin
FileToSend := 'c:\MSDOS.SYS'; // тут файл, который мы рассылаем любому попросившему.
with TFileStream.Create(FileToSend, fmOpenRead) do
try
FileToSend := ExtractFileName(FileToSend) + #00;
GetMem(p, 256);
try
CopyMemory(p, @FileToSend[1], Length(FileToSend));
AThread.Connection.Socket.Send(p^, 256);
finally
FreeMem(p);
end;
FileSize := Size;
AThread.Connection.Socket.Send(FileSize, SizeOf(FileSize));
GetMem(p, Size);
try
ReadBuffer(p^, Size);
AThread.Connection.Socket.Send(p^, Size);
finally
FreeMem(p);
end;
finally
Free;
end;
AThread.Connection.Disconnect;
ShowMessage('Послано');
end;
Ну все... сервер готов.
Теперь клиента:
Тоже самое. Форма, на форме IdTCPClient, свойство Port указываем такое же, что и в bind сервера. host = ip адрес машины, на которой стоит сервер. (127.0.0.1 для локального компа), Кладем ещё кнопочку и при нажатии кнопки делаем:
IdTCPClient1.Connect;
В обработчике (Events) onConnected пишем следующее:
Код: Выделить всё
procedure TForm1.IdTCPClient1Connected(Sender: TObject);
var
FileName: PChar;
FileSize: Cardinal;
FS: TFileStream;
begin
GetMem(FileName, 256);
try
IdTCPClient1.ReadBuffer(FileName^, 256);
IdTCPClient1.ReadBuffer(FileSize, SizeOf(FileSize));
FS := TFileStream.Create('incoming\'+FileName, fmCreate); // тут создается файл, я его положил в каталог incoming
try
IdTCPClient1.ReadStream(FS, FileSize);
finally
FS.Free;
end;
finally
FreeMem(FileName);
end;
ShowMessage('Принято');
end;
Ну вот и все... простейший клиент-сервет на инди функционирует...