Модераторы: Snowy, Poseidon, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Локальная сеть 
:(
    Опции темы
Tokagero
Дата 25.10.2006, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 25.10.2006

Репутация: нет
Всего: нет



Итак, идея в том чтоб сделать прогу, которая с определенного сервера локальной сети передавала картинки на несколько других компов в сети, причем без открывания локального доступа и т.д. Сделать программу которая ложит картинку в опред. открытый каталог а другой комп копировал - элементарно. Надо чтоб этого небыло. Чтоб компы каким-то образом коннектились и серв передавал, компы получали. Помогите  smile 
PM MAIL   Вверх
drkot
Дата 25.10.2006, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 0
Всего: 8



На компах получателях поднимаеш серверные сокеры (думаю UDP лучший вариант)
На компе передатчике поднимаеш клиентский сокет и транслируеш с него инфу (какую угодно) в виде широковещательных послок.
Самый простой вариант воспользоваться indy9. меньше заморочек и разобраться не сложно.


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
Tokagero
Дата 25.10.2006, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 25.10.2006

Репутация: нет
Всего: нет



А можно мне написать пример. Я в этом  smile а оно надо. Допустим, чтоб комп-серв отсылал какую-то картинку на 2 других компа?? Чтоб попроще
PM MAIL   Вверх
Tokagero
Дата 27.10.2006, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 25.10.2006

Репутация: нет
Всего: нет



Ага. Значит, я немного разобрался с УДП. Я непонял несколько вещей:
1) Порт. Что это за штука, как его определить и т.д.
2) Как оформить передачу файлов сразу на несколько компьютеров, а не на 1.
Код

unit MainUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, XPMan, ComCtrls, IdUDPClient,
  IdBaseComponent, IdComponent, IdUDPBase, IdUDPServer, IdSocketHandle;

type
  TMainForm = class(TForm)
    OpenBtn: TButton;
    FileEdit: TLabeledEdit;
    SendBtn: TButton;
    GroupBox1: TGroupBox;
    SizeCap: TLabel;
    BufCount: TLabel;
    ProgressBar: TProgressBar;
    StatusLabel: TLabel;
    SizeLabel: TLabel;
    BufLabel: TLabel;
    UDPServer: TIdUDPServer;
    OpenDialog: TOpenDialog;
    UDPClient: TIdUDPServer;
    SaveDialog: TSaveDialog;
    procedure OpenBtnClick(Sender: TObject);
    procedure SendBtnClick(Sender: TObject);
    procedure UDPServerUDPRead(Sender: TObject; AData: TStream;
      ABinding: TIdSocketHandle);
    procedure UDPClientUDPRead(Sender: TObject; AData: TStream;
      ABinding: TIdSocketHandle);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  MainForm: TMainForm;
  get_accept: boolean = false;
  ServerStream : TFileStream;
  first_       : boolean=true;
  get_buffers  : integer;
  get_buf_num  : integer;
implementation

{$R *.dfm}

procedure SendProcedure(FStream: TFileStream; UDPClient: TIdUDPServer;
           StatusLabel :Tlabel; ProgressBar :TProgressBar);
var
  i,j,count: integer;
  buf : array[1..40000] of Char;
begin
  i:=round(FStream.Size/40000);
  if (i*40000<FStream.Size) then i:=i+1;
  ProgressBar.Max:=i;
  UDPClient.Send('localhost',1151,'count_buf:'+IntToStr(i)+'#');
  Application.ProcessMessages;
  for j:=1 to  i do
  begin
    if i=j then
    count:=FStream.Read(buf,FStream.Size-((i-1)*40000))
    else count:=FStream.Read(buf,length(buf));
    UDPClient.SendBuffer('localhost',1151,buf,count);
    StatusLabel.Caption:='ïåðåäà÷à ïàêåòà ¹ '+IntToStr(j);
    ProgressBar.Position:=j;
    while get_accept=false do Application.ProcessMessages;
    get_accept:=false;
  end;
end;

procedure TMainForm.OpenBtnClick(Sender: TObject);
var
  FStream : TFileStream;
begin
  if OpenDialog.Execute
  then
   begin
    FileEdit.Text:=OpenDialog.FileName;
    FStream:=TFileStream.Create(OPenDialog.FileName,fmOpenRead);
    SizeLabel.Caption:=IntToStr(Round(FStream.Size/1024))+' êèëîáàéò.';
    BufLabel.Caption:=FloatToStr(FStream.Size/40000)+' ïàêåòîâ.';
    FStream.free;
   end; 
end;

procedure TMainForm.SendBtnClick(Sender: TObject);
var
  FStream : TFileStream;
begin
  if not FileExists(FileEdit.Text) then Exit;
  FStream:=TFileStream.Create(FileEdit.Text,fmOpenRead);
  SendProcedure(FStream, UDPClient, StatusLabel, ProgressBar);
  FStream.Free;
end;

рrocedure TMainForm.UDPServerUDPRead(Sender: TObject; AData: TStream;
  ABinding: TIdSocketHandle);
var
  str_buf : array[1..20] of Char;
begin
  if first_=true then
  begin
    AData.Read(str_buf,length(str_buf));
    if copy(str_buf,1,10)='count_buf:' then
    get_buffers:=StrToInt(copy(str_buf,11,pos('#',str_buf)-11));
    if SaveDialog.Execute then
    begin
      first_:=false;
      ServerStream:=TFileStream.Create(SaveDialog.FileName,fmCreate);
    end;
  end else
  begin
    get_buf_num:=get_buf_num+1;
    ServerStream.Position:=ServerStream.Size;
    ServerStream.CopyFrom(AData,AData.Size);
    UDPServer.Send('localhost',1152,'accept');
    if get_buffers=get_buf_num then
    begin
      ShowMessage('Âñå, ïðèíÿòî!');
      ServerStream.Free;
    end;
  end;
end;

procedure TMainForm.UDPClientUDPRead(Sender: TObject; AData: TStream;
  ABinding: TIdSocketHandle);
begin
  get_accept:=true;
end;

end.

Это я нашел. Не помню, где. Прошу обяснить как ТУТ это переоборудовать. И кКак оформить передачу файлов сразу на несколько компьютеров, а не на 1.
PM MAIL   Вверх
drkot
Дата 27.10.2006, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 0
Всего: 8



Цитата(Tokagero @  27.10.2006,  08:45 Найти цитируемый пост)
Порт. Что это за штука, как его определить и т.д.

Если сравнить комп с многоэтажным домом, то порт это дверь (или окно) через которое проходит информация адрессованная конкретному потоку.
Порт нужно не определять, а задавать. Межеш выбрать практически любое число от 10000 до 65000.

Цитата(Tokagero @  27.10.2006,  08:45 Найти цитируемый пост)
Как оформить передачу файлов сразу на несколько компьютеров, а не на 1.

смотри метод boardcast (отсылает широковещательные пакеты на все компьютеры подсети).


Цитата(Tokagero @  27.10.2006,  08:45 Найти цитируемый пост)
Прошу обяснить как ТУТ это переоборудовать.

Перво наперво разделить серверную и клиенсткую часть.

Код

UDPClient.Send('localhost',1151,'count_buf:'+IntToStr(i)+'#');
заменить на 
UDPClient.Broadcast('count_buf:'+IntToStr(i)+'#',1151,);

и по аналогии для передачи тела файла.

PS: порт можно оставить тотже


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
Tokagero
Дата 27.10.2006, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 25.10.2006

Репутация: нет
Всего: нет



Цитата(drkot @  27.10.2006,  11:21 Найти цитируемый пост)
и по аналогии для передачи тела файла.

?? Мне то и надо обяснить, куда собсно вписатть тело файла. Допустим, надо передать файл "c:\pic.jpg"

PM MAIL   Вверх
Tokagero
Дата 27.10.2006, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 25.10.2006

Репутация: нет
Всего: нет



Единственное что теперь надо это способ передачи тела самого файла. 
Цитата(Tokagero @  27.10.2006,  12:51 Найти цитируемый пост)
Допустим, надо передать файл "c:\pic.jpg"

Можно это как-то в двух строчках продемонстрировать??
И вы говорили, send заменить на broadcast... А что на что  тогда менять у "получателя"??

Это сообщение отредактировал(а) Tokagero - 27.10.2006, 14:15
PM MAIL   Вверх
drkot
Дата 27.10.2006, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 0
Всего: 8



У получателя все останется как было.

есть два типа функции send
в одном указавается адресс получателя, а в другой нет.
тебе нужна функия без адреса получателя (boardcast) + одноименное свойство компонента boardcast:=true.

И думаю болеше ничего менять не надо.
Освобожусь и подправлю твой исходник.


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
Tokagero
Дата 27.10.2006, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 25.10.2006

Репутация: нет
Всего: нет



Спасибо... Буду очень признателен. 
PM MAIL   Вверх
drkot
Дата 27.10.2006, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 0
Всего: 8



Вот накрапал.
Реализована односторонняя передача файлов.

PS: С тебя ящик пива.  smile 

Присоединённый файл ( Кол-во скачиваний: 153 )
Присоединённый файл  FileTransfer.zip 10,82 Kb


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
Tokagero
Дата 28.10.2006, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 25.10.2006

Репутация: нет
Всего: нет



По мойму эта программа для получателя... а НЕ для отправителя. Мне то и надобыло чтоб была прога серва, отправляющего опред. файл, например, с:\pic.jpg. Просто мне в 12.30 (украина,донецк) седня надо буде это показать... Можно реализовать??  smile 
Зы сервер отправляет, компы получают.

Это сообщение отредактировал(а) Tokagero - 28.10.2006, 09:12
PM MAIL   Вверх
drkot
Дата 30.10.2006, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 0
Всего: 8



там две программы одна передает (та что с кнопкой), а вторая принимает (та что с memo).
если ты их обе откомпилировал и запустил то при нажатии на кнопку появится запрос на выбор файла. файл рассылается в пределах подсети.


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
drkot
Дата 30.10.2006, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 0
Всего: 8



Цитата(Tokagero @  28.10.2006,  09:05 Найти цитируемый пост)
Зы сервер отправляет, компы получают.

а сермер не комп типа?

соединение всегда инициирует клиент, сервер может только отвечает.


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
Rodman
Дата 4.11.2006, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: нет
Всего: 122



drkot, а вот можно ли как нить эту картинку получить и прямо из потока вывести в Image... и так каждую секунду???
PM MAIL WWW Skype GTalk YIM MSN   Вверх
Tokagero
Дата 4.11.2006, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 25.10.2006

Репутация: нет
Всего: нет



drkot, в том примере что ты дал сервер получает файлы... А клиент отправляет... А можно наоборот... Я могу выложить то что я навоял и сможешь подправить?? smile 
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.2146 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.