|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Передача файла от сервера нескольким клиентам через сокеты
Доброго времени суток. Скажите пожалуйста, как реализовать передачу файла от сервера к нескольким клиентам с помощью сокетов.
Последний раз редактировалось Awesome, 13.01.2013 в 20:29. |
#2
|
|||
|
|||
Сервер, отправка файлов клиентам...
Серверная сторона. Отправка файлов клиентам...
Код:
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; Клиенты в сети. Приём файлов от сервера... 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
|
|||
|
|||
Может кому нибудь понадобиться.......
Может кому нибудь понадобиться.......
|
Этот пользователь сказал Спасибо ypok1c за это полезное сообщение: | ||
Dagmanor (05.08.2013)
|