Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.06.2008, 23:09   #1
SeЯgey
Пользователь
 
Регистрация: 03.04.2008
Сообщений: 50
Вопрос Потоки, передача файлов по сети

Возник вопрос как передать несколько файлов, при этом количество их при каждой передаче меняется.
мне предложили использовать потоки, и в каждом потоке передовать файл, но я не знаю как создавать потоки для передачи,
Помогите


код который я использую для передачи одного файла

Отправка:

Код:
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;

Получение:
Код:
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;

Последний раз редактировалось SeЯgey; 02.06.2008 в 12:50.
SeЯgey вне форума Ответить с цитированием
Старый 14.01.2011, 12:38   #2
evgeny_sh
 
Регистрация: 03.01.2011
Сообщений: 3
По умолчанию

Господа, а кто знает, как можно прикрутить ProgressBar к процедуре передачи данных сервером в данном примере? С клиентом вроде разобрался, а с сервером ниче не выходит
evgeny_sh вне форума Ответить с цитированием
Старый 06.02.2011, 20:35   #3
eekvasov
 
Регистрация: 05.02.2011
Сообщений: 4
По умолчанию

Цитата:
Сообщение от SeЯgey Посмотреть сообщение
Возник вопрос как передать несколько файлов, при этом количество их при каждой передаче меняется.
мне предложили использовать потоки, и в каждом потоке передовать файл, но я не знаю как создавать потоки для передачи,
Помогите


код который я использую для передачи одного файла

Отправка:

Код:
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;

Получение:
Код:
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;
Этот код работает при включении клиента, когда на сервере выбран файл. Попытки ещё передать при включенном клиенте у меня кончаются неудачей. Есть примеры многократное передачи но они запускаются
IdTCPClient1.ConnectAndGetAll;
В этом случае должен быть отсоединён клиент.
А этих примеров много.
Пробовал настроить TidFTP, но не получилось пока. Примеры выкладываются часто неверные.
eekvasov вне форума Ответить с цитированием
Старый 02.04.2011, 23:51   #4
Lifefine
Пользователь
 
Регистрация: 03.10.2008
Сообщений: 93
По умолчанию

Плиз ответьте как передать повторные файлы?
Lifefine вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача по сети каталога. Indy zhefran Работа с сетью в Delphi 6 13.08.2008 15:19
Передача файлов по локальной сети(Indy) Biowulf86 Помощь студентам 1 08.05.2008 13:08
передача звука по сети и вэб Банзай Работа с сетью в Delphi 2 07.01.2008 22:21
Передача файлов по UDP GAGARIN-NEW Работа с сетью в Delphi 3 15.11.2007 22:45
Передача файлов wolff Работа с сетью в Delphi 3 03.03.2007 15:54