Форум программистов, компьютерный форум, киберфорум
Delphi: Сети
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 14.05.2013
Сообщений: 2
1

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

13.11.2013, 15:50. Показов 2138. Ответов 5
Метки нет (Все метки)

Привет всем! Столкнулся с проблемой при принятии и переименовании файла. Я только начинаю во всем этом разбираться и прихожу к помощи книг, но в них далеко не так все понятно, как хотелось бы Поможете ли мне разобраться, что нужно переделать, чтобы в локальной сети мог передаться файл вместе с именем у него сохранилось имя, вместо "output.dat"?
Максимум, что у меня получалось - сохранение всего пути в этот же файл =\
Вот "Сервер":
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
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdContext, IdTCPServer, IdBaseComponent, IdComponent,
  IdCustomTCPServer, StdCtrls, ScktComp;
 
type
  TForm1 = class(TForm)
    ServerSocket1: TServerSocket;
    Button1: TButton;
    Edit1: TEdit;
    OpenDialog1: TOpenDialog;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ServerSocket1Accept(Sender: TObject; Socket: TCustomWinSocket);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenDialog1.Execute then
Edit1.Text:=OpenDialog1.FileName;
end;
 
procedure TForm1.ServerSocket1Accept(Sender: TObject; Socket: TCustomWinSocket);
begin
 
end;
 
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
fs: TFileStream;
Data: TMemoryStream;
begin
//Получена команда s - отправить файл
if Socket.ReceiveText = 's' then
begin
fs:=TFileStream.Create(Edit1.Text, fmOpenRead);
try
//Загружаю файл в поток TFileStream
fs.Position:= 0;
//Сначала отправляем длину файла и добавляем к этому знак #0 по этому знаку мы отделим длину от данных файла
Socket.SendText('Size:'+IntToStr(fs.Size)+#0+'Name:'+edit1.text+#0);
//Посылаем файл.
Socket.SendStream(fs);
finally
end;
end;
 // + #0+'Name:' + Edit1.Text+#0   + 'Name:' + edit1.text + #0
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ScktComp, StdCtrls;
 
type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Label1: TLabel;
    Button1: TButton;
    Button2: TButton;
    ClientSocket1: TClientSocket;
    SaveDialog1: TSaveDialog;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket);
    procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
  private
  fs: TFileStream;
  Reciving:Boolean;
  DataSize: integer;
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket1.Address:=Edit1.Text;
ClientSocket1.Active:=true;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
ClientSocket1.Active:=false;
end;
 
procedure TForm1.ClientSocket1Connect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
Socket.SendText('s') ;
end;
 
procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
 
var
s, s1: string;
begin
s:= Socket.ReceiveText;
if Reciving then
begin
fs.Write(s[1], length(s));
if fs.Size=DataSize then
begin
fs.Free;
Reciving:=false;
Application.MessageBox('Файл принят', 'Внимание!!!');
//if SaveDialog1.Execute then
 
end;
exit;
end;
if copy(s, 1, 5)='Size:' then
begin
s1:=copy(s, 6, Pos(#0, s)-6);
DataSize:=StrToInt(s1);
Delete(s, 1, Pos(#0, s));
if copy(s, 1, 5)='Name:' then
begin
s1:=copy(s, 6, Pos(#0, s)-6);
Delete(s, 1, Pos(#0, s));
Reciving:=true;
fs:=TFileStream.Create('output.dat', fmCreate);
fs.Write(s[1], length(s));
end;
end;
end;
 
end.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.11.2013, 15:50
Ответы с готовыми решениями:

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

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

Передача группы файлов по локальной сети
Добрый день. Мне нужно передать по локальной сети клиентам несколько файлов. Код для передачи нашел...

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

__________________
5
2 / 2 / 0
Регистрация: 06.11.2013
Сообщений: 7
14.11.2013, 17:32 2
Сам скопипастил не давно длинный файл не хотел ходить.
Если файл длинный лучше так это на стороне отправщика файла:

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
  MS := TMemoryStream.Create; // Создаём буфер для файла
        MS.LoadFromStream(xxxxxx);
        MS.Position := 0;
        // XML.SaveToStream(MS);
        // MS.SaveToFile('e:\1111.111');
        ClientSocket.Sendln(inttostr(MS.Size));
        // XML.SaveToXML(xmls);
        SendOk := true;
 
        NLeft := MS.Size; { сколько байт осталось послать }
        MS.Position := 0;
        { посылаем длину файла }
        if ClientSocket.SendBuf(NLeft, SizeOf(NLeft)) <> SizeOf(NLeft) then
          SendOk := false;
        { пока есть еще что посылать и посылка идет успешно, цикл }
        while (NLeft > 0) and SendOk do
        begin
          { читаем очередную "порцию" посылаемого файла }
          NRead := SizeOf(Buf); { будем читать весь буфер }
          if NRead > NLeft then
            NRead := NLeft;
          { а если осталось меньше, чем его длина, то остаток }
          BufLen := MS.Read(Buf[0], NRead); { прочитати }
          if ClientSocket.SendBuf(Buf[0], NRead) <> NRead then
            SendOk := false; { послали }
          Dec(NLeft, NRead); { сколько еще осталось }
        end;
        MS.Free;

Это на стороне получения:
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
procedure TCCtrl.ReceiveFile(var Strm: TMemoryStream;ReceiveOk:boolean);
var
//  Strm    : TFileStream;
  Status  : (StFirst,StNext,StComplete,StTimeOut);
  NLeft  : longint;
  NSize  : longint;
  NRead  : longint;
  Buf    : array[0..511] of byte;
  tcp:TTCPClient;
begin
  { создаем поток для записи принимаемого файла }
  Strm:=TMemoryStream.Create();
  { сколько байт осталось принять (пока не заполнено) }
  NLeft:=0;
  { статус: StFirst-принимаем длину, StNext-принимаем файл, StTimeOut-превышен тайм-аут }
  Status:=StFirst;
  while Status in [StFirst,StNext] do begin
    if tcp.WaitForData(500) then
    case Status of
      StFirst : if tcp.PeekBuf(NLeft,SizeOf(NLeft))>0 then begin
                    { в буфере есть по крайней мере 4 байта - пришла длина }
                    tcp.ReceiveBuf(NLeft,SizeOf(NLeft)); { длина файла }
                    { если длина>0 (непустой файл, могут и пустой послать), то будем его читать }
                    if NLeft>0 then Status:=StNext else Status:=stComplete;
                end;
      StNext  : if tcp.PeekBuf(Buf[0],1)>0 then begin
                    { в буфере есть хоть что-то }
                    NSize:=SizeOf(Buf);              { будем просить весь буфер }
                    if NSize>NLeft then NSize:=NLeft; { а если осталось меньше, чем его длина, то остаток }
                    NRead:=tcp.ReceiveBuf(Buf[0],NSize); { сколько на самом деле получили }
                    Strm.Write(Buf[0],NRead);  { то, что получили, вывели в поток }
                    { сколько еще осталось }
                    Dec(NLeft,NRead);
                    if NLeft=0 then Status:=stComplete; { если ничего не осталось, то конец }
                end;
    end;
    { сюда неплохо добавить обработку timeOut - если прошло слишком много }
    { времени с момента последней посылки, то Status:=StTimeOut          }
    { это вы легко напишите сами, опускаю для ясности                    }
  end;
  { закрыли поток }
 // if Status<>StComplete then DeleteFile(FileName); { если неудачно, то файл от греха удаляем }
  ReceiveOk:=(Status=StComplete); { результат приема }
end;
Добавлено через 6 минут
Соответсвенно это вместо Socket.SendStream(fs); тоесть отправки и получения именно самого потока, а имя можешь так и передавать текстом.
1
2646 / 2269 / 278
Регистрация: 24.12.2010
Сообщений: 13,725
14.11.2013, 20:18 3
Вся проблема в том, что этот до безобразия кривой пример, гуляющий с подачи какой-то школоты по всему Рунету в миллионах не менее кривых вариациях, в очередной раз бездумно сдут - теперь тобой)

В подтверждение сдувания вот - delphi if Reciving then
1
0 / 0 / 0
Регистрация: 14.05.2013
Сообщений: 2
14.11.2013, 21:55  [ТС] 4
Цитата Сообщение от mss Посмотреть сообщение
Вся проблема в том, что этот до безобразия кривой пример, гуляющий с подачи какой-то школоты по всему Рунету в миллионах не менее кривых вариациях, в очередной раз бездумно сдут - теперь тобой)

В подтверждение сдувания вот - delphi if Reciving then
Ну да, в основе своей он взят из книги, я написал это сразу Но все таки, есть возможность сделать так, чтобы имя правильно передалось? с момента как я разместил здесь эту тему прошло пару дней, кое-что успел изменить (не в лучшую сторону ), в следствии чего соединение происходит, но передача файлов не производится ни в какую. И да, каюсь, я хреново ориентируюсь в программировании) Студент, курсовая, все дела)
А изменил я подачу имени, еще кривее организовал её, чем та была предложена
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
var
  Form1: TForm1;
  fullFileName: string;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
Edit1.Text:=OpenDialog1.FileName;
end;
fullFileName:=Edit1.Text;
Label3.Caption:=ExtractFileName (fullFileName);
end;
 
procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
Label1.Caption:='Клиент присоединен';
end;
 
procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
Label1.Caption:='Клиент отсоединился';
end;
 
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
fs: TFileStream;
Data: TMemoryStream;
begin
//Получена команда s - отправить файл
if Socket.ReceiveText = 's' then
begin
fs:=TFileStream.Create(Edit1.Text, fmOpenRead);
try
//Загружаю файл в поток TFileStream
fs.Position:= 0;
//Сначала отправляем длину файла и добавляем к этому знак #0 по этому знаку мы отделим длину от данных файла
Socket.SendText('Size:'+IntToStr(fs.Size)+#0+'Name:'+fullFileName+#0);
Добавлено через 17 минут
клиент
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if copy(s, 1, 5)='Size:' then
begin
s1:=copy(s, 6, Pos(#0, s)-6);
DataSize:=StrToInt(s1);
Delete(s, 1, Pos(#0, s));
if copy(s, 1, 5)='Name:' then
begin
s1:=copy(s, 6, Pos(#0, s)-6);
F:=s1;
Delete(s, 1, Pos(#0, s));
end;
Reciving:=true;
fs:=TFileStream.Create(F, fmCreate);
fs.Write(s[1], length(s));
 
end;
ах да, делал по примеру из книги "Delphi глазами Хакера"
0
5 / 5 / 1
Регистрация: 06.11.2013
Сообщений: 35
15.11.2013, 07:24 5
Цитата Сообщение от mss Посмотреть сообщение
Вся проблема в том, что этот до безобразия кривой пример, гуляющий с подачи какой-то школоты по всему Рунету в миллионах не менее кривых вариациях, в очередной раз бездумно сдут - теперь тобой)

В подтверждение сдувания вот - delphi if Reciving then
ну Я и написал что скопипастил если что, и он у меня как не странно работает ))) Если очень умный помоги мне с Soap разобратся лучше )) тема рядам голову сломал чего не передается массив.

Добавлено через 1 час 4 минуты
Похоже это ты про его пример кривой , а не про мой , я то подумал)))
0
6 / 6 / 1
Регистрация: 21.11.2013
Сообщений: 76
21.11.2013, 23:17 6
Первое нагугленное за минуту...



Добавлено через 1 минуту
О! тут чужие линки нельзя постить жесточайше в общем -в гугле 'indy передача файлов с именем'
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.11.2013, 23:17

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.