Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 13.01.2013, 15:34
Awesome Awesome вне форума
Прохожий
 
Регистрация: 02.12.2012
Сообщения: 6
Репутация: 10
По умолчанию Передача файла от сервера нескольким клиентам через сокеты

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

Последний раз редактировалось Awesome, 13.01.2013 в 20:29.
Ответить с цитированием
  #2  
Старый 04.07.2013, 18:53
ypok1c ypok1c вне форума
Прохожий
 
Регистрация: 03.07.2013
Сообщения: 2
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Сервер, отправка файлов клиентам...

Серверная сторона. Отправка файлов клиентам...


Код:
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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ScktComp, ComCtrls, StdCtrls, Gauges;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    StatusBar1: TStatusBar;
    ProgressBar1: TProgressBar;
    ServerSocket1: TServerSocket;
    Gauge1: TGauge;
    OpenDialog1: TOpenDialog;
    procedure FormDestroy(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure ServerSocket1ClientConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ServerSocket1ClientDisconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  MS: TMemoryStream;
implementation
 
{$R *.dfm}
 
procedure TForm1.FormDestroy(Sender: TObject);
begin
ServerSocket1.Close;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
Size: integer;
P: ^Byte;
begin
MS := TMemoryStream.Create; // Создаём буфер для файла
if OpenDialog1.Execute then // Если выбрали файл
 
begin
 
MS.LoadFromFile(OpenDialog1.FileName); // Загружаем файл в буфер
// Посылаем информацию о файл (команда # название # размер)
ServerSocket1.Socket.Connections[0].SendText('file#'+ ExtractFileName(OpenDialog1.FileName) +'#'+IntToStr(MS.Size)+'#');
 
MS.Position := 0; // Переводим каретку в начало файла
P := MS.Memory; // Загружаем в переменную "P" файл
Size := ServerSocket1.Socket.Connections[0].SendBuf(P^, MS.Size); // Посылаем файл
// Выводим прогресс
ProgressBar1.Position := Size*100 div MS.Size;
Gauge1.Progress := Size*100 div MS.Size;
StatusBar1.SimpleText := 'Отправлено '+IntToStr(Size)+' из '+IntToStr(MS.Size)+' байт'
end;
end;
procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
StatusBar1.SimpleText := 'Соединение установлено';
end;
 
procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
StatusBar1.SimpleText := 'Соединение не установлено';
end;
 
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
begin
if Socket.ReceiveText = 'end' then // Если клиент принял файл, то...
begin
  StatusBar1.SimpleText := 'Клиент принял файл, можно закрыть программу';
  MS.Free; // Убиваем буфер
end;
end;
 
Клиенты в сети. Приём файлов от сервера...
 
<div align="center"><img src="http://i46.fastpic.ru/big/2013/0704/60/783f43b18b197dff2824d41e3a04fc60.jpg" border="0" alt=""></div>
 
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, ScktComp, StdCtrls, Gauges, ExtCtrls;
 
type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    ClientSocket1: TClientSocket;
    Panel1: TPanel;
    Button1: TButton;
    Button2: TButton;
    ProgressBar1: TProgressBar;
    Gauge1: TGauge;
    StatusBar1: TStatusBar;
    procedure Writing(Text: string);
    procedure FormDestroy(Sender: TObject);
    procedure ClientSocket1Connect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ClientSocket1Disconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject); // Процедура записи в данных в буфер
  private
    { Private declarations }
    Name: string; // Имя файла
    Size: integer; // Размер файла
    Receive: boolean; // Режим клиента
    MS: TMemoryStream; // Буфер для файла
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.FormDestroy(Sender: TObject);
begin
  ClientSocket1.Open; // Открываем сокет
  Receive := false; // Режим клиента - приём команд
end;
 
procedure TForm1.ClientSocket1Connect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
StatusBar1.SimpleText := 'Соединение установлено';
end;
 
procedure TForm1.ClientSocket1Disconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
StatusBar1.SimpleText := 'Соединение не установлено';
end;
 
procedure TForm1.Writing(Text: string);
Var s:string;
begin
if MS.Size < Size then // Если принято байт меньше размера файла, то...
MS.Write(Text[1], Length(Text)); // Записываем в буфер
// Выводим прогресс закачки файла
 
ProgressBar1.Position := MS.Size*100 div Size;
Gauge1.Progress := MS.Size*100 div Size;
 
StatusBar1.SimpleText := 'Принято '+IntToStr(MS.Size)+' из '+IntToStr(Size);
if MS.Size = Size then // Если файл принят, то...
begin
Receive := false; // Переводим клиента в нормальный режим
MS.Position := 0; // Переводим каретку в начало буфера
if not(DirectoryExists(ExtractFilePath(ParamStr(0)) + '\' + 'Хранилище Файлов')) then CreateDir(ExtractFilePath(ParamStr(0)) + '\' + 'Хранилище Файлов');
MS.SaveToFile(ExtractFilePath(ParamStr(0)) + '\' + 'Хранилище Файлов\' + Name); // Сохраняем файл
ClientSocket1.Socket.SendText('end'); // Посылаем команду "end", то есть файл принят
MS.Free; // Убиваем буфер
StatusBar1.SimpleText := 'Файл принят,можно закрыть программу';
end;
end;
 
 
 
procedure TForm1.ClientSocket1Read(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 := 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)); // Удаляем последний разделитель
Label1.Caption := 'Размер файла: '+IntToStr(Size)+' байт'; // Выводим размер файла
Label2.Caption := 'Имя файла: '+Name; // Выводим имя файла
Receive := true; // Переводим сервер в режим приёма файла
Writing(RText); // Записываем данные в буфер
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
 ClientSocket1.Open; // Открываем сокет
 Receive := false; // Режим клиента - приём команд
  
 Form1.Caption:='УСПЕШНОЕ ПОДКЛЮЧЕНИЕ';
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
ClientSocket1.Close; // Закрываем сокет
 Form1.Caption:='ВЫ ОТКЛЮЧЕНЫ';
end;
 
end.

Последний раз редактировалось M.A.D.M.A.N., 04.07.2013 в 20:04.
Ответить с цитированием
Этот пользователь сказал Спасибо ypok1c за это полезное сообщение:
Dagmanor (05.08.2013)
  #3  
Старый 04.07.2013, 18:56
ypok1c ypok1c вне форума
Прохожий
 
Регистрация: 03.07.2013
Сообщения: 2
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Может кому нибудь понадобиться.......

Может кому нибудь понадобиться.......
Ответить с цитированием
Этот пользователь сказал Спасибо ypok1c за это полезное сообщение:
Dagmanor (05.08.2013)
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 04:13.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025