Форум программистов, компьютерный форум, киберфорум
Delphi: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/111: Рейтинг темы: голосов - 111, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 03.06.2008
Сообщений: 5

Потоки, передача файлов по сети

03.06.2008, 16:57. Показов 22280. Ответов 9
Метки нет (Все метки)

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

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

Отправка:

Код:
view plaincopy to clipboardprint?

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
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;   
 
Получение:
Код:
view plaincopy to clipboardprint?
  
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;
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.06.2008, 16:57
Ответы с готовыми решениями:

Передача файлов по сети!!!
Дело серьёзное - пишу документооборот! Как передавать файлы (в основном текстовые) по локальной сети с проверкой правильности передачи от...

Передача файлов по сети
Собственно начал изучать работу делфи с сетями и появились проблемы. Как я понимаю для передачи файлов по сети, на стороне клиента и на...

Передача файлов по сети
добрый вечер. Не могу организовать передачу файлов с помощью TServerSocket и TClientSocket. Подскажите пожалуйста как это сделать.

9
 Аватар для Ядовитый
7 / 7 / 4
Регистрация: 17.02.2007
Сообщений: 165
04.06.2008, 08:53
Цитата Сообщение от SeЯgey Посмотреть сообщение
мне предложили использовать потоки, и в каждом потоке передовать файл, но я не знаю как создавать потоки для передачи,

procedure TForm1.IdTCPClient1Connected(Sender: TObject);
var
FS: TFileStream;
begin
...
FS := TFileStream.Create('incoming\'+FileName, fmCreate);
try
IdTCPClient1.ReadStream(FS, FileSize);
finally
FS.Free;
end;

end;
Говоришь не умеешь пользоваться потоками, а это:
FS: TFileStream;
что такое?

Если для передачи, то у компонента есть метод WriteStream(...)
0
0 / 0 / 0
Регистрация: 03.06.2008
Сообщений: 5
05.06.2008, 15:02  [ТС]
меня интересует как создать несколько потоков и передать в них несколько файлов, а я не знаю как это сделать
0
 Аватар для Ядовитый
7 / 7 / 4
Регистрация: 17.02.2007
Сообщений: 165
05.06.2008, 15:23
В общем, тебе надо использовать некоторые спец.последовательности символов при передаче нескольких файлов. Эти последовательности сигнализируют принимающему концу об имени файла, о его размере, и содержат также содержание файла. При этом ты побеждаешь фрагментацию файла в сети ethernet.
То есть, например, отсылка файла по сети
Delphi
1
2
3
4
5
6
7
8
9
MS_Send:= TMemoryStream.Create; // Создаём буфер для файла
MS_Send.LoadFromFile(FileName); // Загружаем файл в буфер
 
// Посылаем информацию о файл (команда # название # размер)
ServerSocketConfig.Socket.Connections[0].SendText('file#'+ExtractFileName(FileName)+'#'+IntToStr(MS_Send.Size)+'#');
Sleep(100);
MS_Send.Position := 0; // Переводим каретку в начало файла
P:= MS_Send.Memory; // Загружаем в переменную "P" файл
Size:= ServerSocketConfig.Socket.Connections[0].SendBuf(P^, MS_Send.Size); // Посылаем файл
На приёмном конце тебе соответственно надо обработать это дело:

Событие OnReceive:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
procedure TModBusShluzService.ServerSocketConfigClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
  Rtext: String; // Принятый текст или данные
begin
  Rtext:= Socket.ReceiveText;
  if Receive then // Если клиент в режиме приёма файла, то...
    Writing(RText) // Записываем данные в буфер
  else // Если клиент не в режиме приёма файла, то...
    if Copy(Rtext, 0, Pos('#', Rtext) - 1) = 'file' then // Если это файл, то...
    begin
      MS_Receive:= TMemoryStream.Create; // Создаём буфер для файла
      // Определяем имя файла
      Delete(Rtext, 1, Pos('#', Rtext));
      Name:= Copy(Rtext, 0, Pos('#', Rtext) - 1);
      // Определяем размер файла
      Delete(Rtext, 1, Pos('#', Rtext)); //
      Size:= StrToInt(Copy(Rtext, 0, Pos('#', Rtext) - 1));
      Delete(Rtext, 1, Pos('#', Rtext)); // Удаляем последний разделитель
      Receive:= True; // Переводим сервер в режим приёма файла
      Writing(RText); // Записываем данные в буфер
и т.д.
 
procedure TModBusShluzService.Writing(Text: String);
begin
  if MS_Receive.Size < Size then // Если принято байт меньше размера файла, то...
    MS_Receive.Write(Text[1], Length(Text)); // Записываем в буфер
  if MS_Receive.Size = Size then // Если файл принят, то...
  begin
    Receive:= False; // Переводим клиента в нормальный режим
    MS_Receive.Position:= 0; // Переводим каретку в начало буфера
    MS_Receive.SaveToFile(Configuration.StartupPath + Name); // Сохраняем файл
    ServerSocketConfig.Socket.Connections[0].SendText('end'); // Посылаем команду "end", то есть файл принят
    FreeAndNil(MS_Receive);
  end;
end;
Использованные компоненты:
ServerSocketConfig: TServerSocket;

Думаю, что общая идея понятна.

С уважением, Ильдар Валеев
0
Junior Developer
 Аватар для velikijmerlin
44 / 44 / 7
Регистрация: 08.06.2009
Сообщений: 261
08.06.2009, 19:42
Доброе время суток!!!

возник такой конфуз..)))

можете подсказать как на нажатие Button1.Click вызвать процедуру
procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);

какие параметры надо использовать при вызове???

Добавлено через 6 часов 50 минут 46 секунд
ребят помогите разобраться с прогами...
вся фигня в том, что взяв коды из первого поста у меня почему то не работает клиент, но всё время не может присоедениться к серверу.. вот коды:


сервер

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdTCPServer, StdCtrls,
  IdAntiFreezeBase, IdAntiFreeze;
 
type
  TForm1 = class(TForm)
    IdTCPServer1: TIdTCPServer;
    IdAntiFreeze1: TIdAntiFreeze;
    procedure IdTCPServer1Connect(AThread: TIdPeerThread);
    procedure FormCreate(Sender: TObject);
//    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
var
FileToSend: String;
FileSize: Cardinal;
p: Pointer;
begin
FileToSend := 'c:\1.txt'; // тут файл, который мы рассылаем любому попросившему.
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.FormCreate(Sender: TObject);
begin
 IdTCPServer1.Active:=true;
end;
{
procedure TForm1.Button1Click(Sender: TObject);
begin
 IdTCPServer1.Active:=true;
end;
}
end.
клиент

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  StdCtrls, IdAntiFreezeBase, IdAntiFreeze;
 
type
  TForm1 = class(TForm)
    IdTCPClient1: TIdTCPClient;
    IdAntiFreeze1: TIdAntiFreeze;
    procedure IdTCPClient1Connected(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
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;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
    with IdTCPClient1 do begin
      try
      Connect();
except
  ShowMessage ('Net Connecta');
end;
 
 
end;
я вот думаю, может я неправильно оформил реакции на нажатие кнопок, потому что как бы моя задумка была такая, запускаешь прогу и сразу как бы всё работает, т.е файл отправляеться на клиент и принимаеться клиентом без лишних нажатий....

заранее спасибо....
0
 Аватар для Gagazh
7 / 7 / 0
Регистрация: 19.01.2010
Сообщений: 7
19.01.2010, 09:03
Вот тут есть 2 примера передачи файлов по сети при помощи Indy и UDP. Выбирай) [ссылка удалена]
2
Lynxesss
15.03.2010, 10:47
пишут сайт по ссылке умер
можно ли эти примеры выложить здесь или есть другие ссылки?
 Аватар для Gagazh
7 / 7 / 0
Регистрация: 19.01.2010
Сообщений: 7
15.03.2010, 12:42
Сайт угнали у меня. Возможно еще, что верну. Примеры выложу позже.
0
 Аватар для Gagazh
7 / 7 / 0
Регистрация: 19.01.2010
Сообщений: 7
15.03.2010, 13:22
Во вложениях 2 примера передачи файла по сети. В первом через компоненты Indy а во втором через протокол UDP вручную.
Вложения
Тип файла: rar Indy.rar (501.6 Кб, 1497 просмотров)
Тип файла: rar UDP.rar (439.7 Кб, 1120 просмотров)
3
31 / 31 / 16
Регистрация: 02.11.2011
Сообщений: 216
27.05.2014, 21:16
Подскажите пожалуйста, почему в delphi 7 UDP отлично работает, а в Delphi XE он ругается на следующие строки:
1) НА сервере модуль UnitServerTrsFl
Delphi
1
  idUDPServer.OnUDPRead:=UDPRead;                                // dиs que l'on recoit un packet par UDP
2) На клиенте UnitClientTrsFl
Delphi
1
 ThreadUdp.OnSendBufferUdp:=IdUDPClient.SendBuffer;
и
Delphi
1
  ThreadUdp.OnSendBufferUdp:=IdUDPClient.SendBuffer;    // lorque que le thread repartira il commence au debut de execute
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.05.2014, 21:16
Помогаю со студенческими работами здесь

Передача файлов по сети
Ребят,помогите найти коды для реализации данной проги,может у кого исходники сохранились,накидайте пожалуйста,очень надо.Спасибо! ...

Передача файлов по сети
Подскажите как передать текстовый файл через сеть?

Передача файлов по локальной сети
Подскажите пожалуйста, какими способами (легче всего) осуществить передачу файлов (синхронизацию файлов) по локалке? Т.е. чтобы по...

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

Передача файлов по локальной сети Delphi
Доброго времени суток) Я начинающий программист, и передо мной возникла проблема передачи файлов на несколько локальных компьютеров. У...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru