Форум по 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
По умолчанию Сервер, отправка файлов клиентам...

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


Код:
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  
Старый 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, время: 20:24.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter