Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.12.2013, 17:01   #1
Ящерка
Пользователь
 
Аватар для Ящерка
 
Регистрация: 26.09.2010
Сообщений: 10
По умолчанию Работа с сетевыми компонентами InDy. Вы последняя надежда

Вы моя последняя надежда. Надо сделать лабораторную работу.
Задание
1. Разработать программу сетевой менеджер файлов, которая позволяет
организовать файловый менеджер при помощи компонента
TIdHTTPServer для обзора и передачи по сети фалов по протоколу http.
2. Разработать инструмент для тестирования работы сервера при помощи
компонента TIdHTTP
3. Разработать не менее 3-х файлов в формате html и выполнить
тестирование работы сервера с использованием любого доступного
браузера.
Код:
unit InDy;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdTCPConnection, IdTCPClient, IdHTTP, Spin,
  IdBaseComponent, IdComponent, IdCustomTCPServer, IdCustomHTTPServer,
  IdHTTPServer,  IdContext, IdURI;

type
  TInDyForm = class(TForm)
    GroupBox1: TGroupBox;
    IdHTTPServer1: TIdHTTPServer;
    Label1: TLabel;
    seServerPort: TSpinEdit;
    bServerStart: TButton;
    MServerLog: TMemo;
    lbData: TListBox;
    GroupBox2: TGroupBox;
    IdHTTP1: TIdHTTP;
    eURL: TEdit;
    Label2: TLabel;
    Label3: TLabel;
    bExecuteQuery: TButton;
    mResponse: TMemo;

    procedure bServerStartClick(Sender: TObject);
    procedure IdHTTPServer1CommandGet(AContext: TIdContext;
      ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
    procedure bExecuteQueryClick(Sender: TObject);
  private
    { Private declarations }

  public
    { Public declarations }
 //   procedure CreateFileList(list: TListBox; filename:String);
  end;

var
  InDyForm: TInDyForm;

implementation

{$R *.dfm}


//Функция формирует список файлов в формате html
procedure CreateFileList(list: TListBox; filename:String);
var
//Файл html списка
    myFile:TextFile;
//Список в формате html
    text:string;
//счётчик
    i:integer;
begin
    AssignFile(myFile, filename);
    ReWrite(myFile);
//Блок оформления html
    WriteLn(myFile, '<html><head><title>List of /</title></head>');
    WriteLn(myFile, '<body><h1>List of /</h1>');
    WriteLn(myFile, '<ul>');
//цикл по списку найденных файлов
    for I := 0 to list.Count - 1 do
    WriteLn(myFile, '<li><a href="'+list.Items[i]+'">'+list.Items[i]+'</a></li>');
    WriteLn(myFile, '</ul></body></html>');
    CloseFile(myFile);
end;

procedure TInDyForm.bExecuteQueryClick(Sender: TObject);
var
//Поток вывода
  output : TMemoryStream;
begin
//Инициализация потока
    output := TMemoryStream.Create;
try
//выполнить запрос
    IdHTTP1.Get(eURL.Text, output);
//сохранить в файл
    Output.SaveToFile('debug');
//вывести в поле отладки
    mResponse.Lines.LoadFromFile('debug');
finally
    Output.Free;
end;
end;

procedure TInDyForm.bServerStartClick(Sender: TObject);
var
//Компонент поиска
    tsr : TSearchRec;
//счётчик
    i:integer;
begin
//Запуск сервера
    if bServerStart.Caption='Запустить' then begin
//номер порта
      IdHTTPServer1.DefaultPort:=seServerPort.Value;
//активировать
      IdHTTPServer1.Active:=true;
      bServerStart.Caption:='Остановить';
//Цикл по списку запущенных интерфейсов
      for i := 0 to IdHTTPServer1.Bindings.Count-1 do
mServerLog.Lines.Add('Сервер запущен'+IdHTTPServer1.Bindings.Items[i].IP+':'+IntToStr(IdHTTPServer1.Bindings.Items[i].Port));
eURL.Text:='http://localhost:'+IntToStr(seServerPort.Value)+'/';
//Поиск файлов в директории
  lbData.Items.Clear;
  if FindFirst('data/' + '*.*',faAnyFile,tsr) = 0 then
repeat
  if (tsr.name<>'.') and (tsr.name<>'..') then lbData.Items.Add(tsr.name);
  until FindNext(tsr) <> 0;
  FindClose(tsr);
//Создание списка фалов
  CreateFileList(lbData,'filelist.html');
end else begin
//Остановка сервера
    IdHTTPServer1.Active:=false;
    bServerStart.Caption:='Запустить';
    mServerLog.Lines.Add('Сервер остановлен');
end;


end;


 //Обработчик запроса от пользователя
procedure TInDyForm.IdHTTPServer1CommandGet(AContext: TIdContext;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var
//запрашиваемый файл
document:string;
//флаг обнаружения файла
fileFound:boolean;
//счётчик
i:integer;
begin
//Запись лога поступившего запроса
mServerLog.Lines.Add('Запрос от '+ARequestInfo.RemoteIP+' "'+ARequestInfo.RawHTTPCommand+'"');
fileFound:=false;
//выделение из запроса файла
document:=TIdURI.URLDecode(ARequestInfo.Document);
//Цикл проверки наличия файла на сервере
//...по списку найденных файлов в каталоге data
for i := 0 to lbData.Count - 1 do
//если найден в списке такой файл,
if document='/'+lbData.Items[i] then begin
fileFound:=true;
//...то выслать файл
AResponseInfo.ServeFile(AContext,'data/'+document);
end;
//если файл не был найден
if not fileFound then
//...выдать список файлов
AResponseInfo.ServeFile(AContext,'filelist.html');
end;


end.
Все запускается, подключается к порту, но при нажатии на кнопку bExecuteQuery (Выполнить запрос) программа подвисает.
Ящерка вне форума Ответить с цитированием
Старый 18.12.2013, 17:19   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ты я так понимаю запрос делаешь к своей же программе? Что в URL написано?
Поставь точку прерывания в начало IdHTTPServer1CommandGet и посмотри сработает она или нет.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.12.2013, 18:58   #3
Ящерка
Пользователь
 
Аватар для Ящерка
 
Регистрация: 26.09.2010
Сообщений: 10
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ты я так понимаю запрос делаешь к своей же программе? Что в URL написано?
Поставь точку прерывания в начало IdHTTPServer1CommandGet и посмотри сработает она или нет.
а можно подробнее, а что то не понимаю)
Ящерка вне форума Ответить с цитированием
Старый 18.12.2013, 19:01   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Подробнее?
Хм. Становишся курсором на строку
Код:
mServerLog.Lines.Add('Запрос от '+ARequestInfo.RemoteIP+' "'+ARequestInfo.RawHTTPCommand+'"');
Жмешь F5 - она выделяется красной точкой слева - это точка прерывания.
Запускаешь программу и делаешь что-то. Если твоя Делфи остановится на коде в месте где поставлена точка прерывания - хорошо. Значит запрос до сервера дошел.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.12.2013, 19:43   #5
Ящерка
Пользователь
 
Аватар для Ящерка
 
Регистрация: 26.09.2010
Сообщений: 10
По умолчанию

Он выделяет эту строку, как я понимаю сервер не пропускает. Пишет Source Breackpoint at и бла бла бла
Ящерка вне форума Ответить с цитированием
Старый 19.12.2013, 11:07   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Да уж... Писать такую программу без базовых знаний...
Смело.
Показывай скриншот после запуска.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.12.2013, 21:00   #7
Ящерка
Пользователь
 
Аватар для Ящерка
 
Регистрация: 26.09.2010
Сообщений: 10
Печаль

Цитата:
Сообщение от Stilet Посмотреть сообщение
Да уж... Писать такую программу без базовых знаний...
Смело.
Показывай скриншот после запуска.
все познается в обучении, а у меня еще много времени для этого, сейчас я не понимаю в чем ошибка и готова рассмотреть все варианты, если они помогут, но критиковать не стоит. Все начинают с чего то и как то(


И по каким то причинам не могу загрузить скриншот, только через залил http://zalil.ru/34862977
Ящерка вне форума Ответить с цитированием
Старый 21.12.2013, 21:49   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
сейчас я не понимаю в чем ошибка
Вот именно поэтому я и настаиваю на том чтоб ты начала причем срочно с отладки.
Это мошный инструмент вылавливания ошибок, если освоишь его сможешь создавать сложные системы.
Еще раз!!!: Ставишь бряк на строку обработчика - запускаешь. Если брякается отладчик значит до компонента запрос доходит. Потом последовательно нажимая F8 проходишь по коду. Мышкой наводи на переменные и свойства и смотри чему они равны. Анализируй правильность этих значений. И так пока не найдешь строку, которая по твоему мнению работает не так как нужно.
Цитата:
но критиковать не стоит
Как раз наоборот. Еще как стоит. Стоит закидать тебя тухлыми яйцпми и гнилыми помидорами по самую шею. Только тогда наконец ты поймешь что нужно не учить предмет а учиться познавать учение так, чтоб дальнейшее изучение предметной области более глубже понималось легко на основе пройденного.
То что нас не убивает делает сильнее. Вот что тебе нужно запомнить если хочешь реализовать хороший продукт.

А теперь вытри сопли и наконец проведи отладку проекта так как положено с начала и до конца. В противном случае даже не пытайся что-то написать серьезное.
I'm learning to live...

Последний раз редактировалось Stilet; 21.12.2013 в 21:51.
Stilet вне форума Ответить с цитированием
Старый 22.12.2013, 18:55   #9
Ящерка
Пользователь
 
Аватар для Ящерка
 
Регистрация: 26.09.2010
Сообщений: 10
По умолчанию

Я бы не обратилась к вам. если бы перед этим не поговорила с преподавателем, мы не смогли решить эту проблему
Ящерка вне форума Ответить с цитированием
Старый 22.12.2013, 19:25   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Значит твой преподаватель ни в зуб ногой. Там все настолько просто что даже смешно. Но!!!
Важнейший элемент решения этой задачи - отладка. Судя по всему твой преподаватель этого не понимает, а значит научить тебя он ничему полезному не сможет.

Вот к примеру:http://www.programmersforum.ru/showthread.php?t=184668
Простейший пример. Рабочий на 100%
Запрос: http://localhost/getmessage в браузере должен заставить этот сервер вывести пустое сообщение.
Попробуй этот пример и убедись что все правильно. Дальше соответственно добавляй по частям свой код и смотри когда будут тормоза - значит в очередном добавленном блоке и кроется проблема. Это я говорю раз уж ты упорно отказываешься отлаживать свой код по шагам.
Так что фразы типа "сервер не пропускает" не катят.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
моя последняя надежда в написании запроса hend230 SQL, базы данных 0 17.12.2012 08:34
Очень прошу!!!!! Последняя надежда на вас..... Кристинка- Общие вопросы Delphi 1 19.05.2012 19:49
Последняя надежда irissska Свободное общение 6 10.07.2009 22:22
Товарищи программисты-вы моя последняя надежда)))) баста Помощь студентам 3 05.02.2009 21:49