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

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

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.11.2013, 18:22   #1
Диана Нестерова
Новичок
Джуниор
 
Аватар для Диана Нестерова
 
Регистрация: 17.11.2013
Сообщений: 4
По умолчанию Не получается web-сервер

Здравствуйте. У меня такая проблема. Пытаюсь создать web-сервер на Delphi, код:
Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
IdHTTPServer1.Active := True; 
end;

procedure TForm1.IdHTTPServer1CommandGet(AThread: TIdPeerThread;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
if ARequestInfo.Document = '/' then
IdHTTPServer1.ServeFile(AThread, AResponseInfo, 'C:\Полигон\Web-server\Pilot\Test.htm' + ARequestInfo.Document);
else
IdHTTPServer1.ServeFile(AThread, AResponseInfo, 'C:\Полигон\Web-server\Pilot' + ARequestInfo.Document);
end;
Но когда я компилирую и запускаю проект то во-первых, на программу покушается брандмауэр (выскакивает с сообщением), а во-вторых, сервер не работает. Когда я ввожу свой IP в адресную строку, браузер пишет: "Cannot open file "C:\Полигон\Web-server\Pilot\Test.htm\". Не удается найти указанный файл".
Диана Нестерова вне форума Ответить с цитированием
Старый 17.11.2013, 18:38   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
на программу покушается брандмауэр
Правильно делает - разрешай в бранде для проги доступ.
Цитата:
Не удается найти указанный файл".
Правильно.
Цитата:
Test.htm\
Если стоит \ то путь расценивается как имя каталога.
А что ты хочешь сделать? Передать файл?
Код:
procedure TForm1.IdHTTPServer1CommandGet(AThread: TIdPeerThread;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var d:string;
begin
if ARequestInfo.Document = '/' then d:='C:\Полигон\Web-server\Pilot\Test.htm'
else begin
  d:=StringReplace(ARequestInfo.Document,'/','\',[RfReplaceall]);
  d:=ExcludeTrailingBackslash(d);
end;
AResponseInfo.ContentStream:=TFileStream.Create(d,fmOpenRead);
AResponseInfo.FreeContentStream:=true
end;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.11.2013, 19:43   #3
Диана Нестерова
Новичок
Джуниор
 
Аватар для Диана Нестерова
 
Регистрация: 17.11.2013
Сообщений: 4
По умолчанию

Цитата:
Правильно делает - разрешай в бранде для проги доступ.
А как бы мне сделать в самой проге, без возни с брандмауэром?
Цитата:
Если стоит \ то путь расценивается как имя каталога.
Так у меня же в коде написано:
Код:
'C:\Полигон\Web-server\Pilot\Test.htm'
Слэш после Test.htm, сам браузер уже добавляет.
Цитата:
А что ты хочешь сделать? Передать файл?
Нет, web-сервер должен открыть в браузере web-страницу, лежащую на жестком диске, при запросе в браузере, моего собственного IP.
Диана Нестерова вне форума Ответить с цитированием
Старый 18.11.2013, 22:48   #4
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Цитата:
Сообщение от Диана Нестерова Посмотреть сообщение
А как бы мне сделать в самой проге, без возни с брандмауэром?
Никак. Одна из функций брандмауэра - запрещать левым программам открывать твои порты для подключения извне, потому было бы странно, если бы его можно было просто так отключать из твоего кода.

Цитата:
Сообщение от Диана Нестерова Посмотреть сообщение
Так у меня же в коде написано:
Код:
'C:\Полигон\Web-server\Pilot\Test.htm'
Слэш после Test.htm, сам браузер уже добавляет.
В коде не так написано )
Код:
'C:\Полигон\Web-server\Pilot\Test.htm' + ARequestInfo.Document
Son Of Pain вне форума Ответить с цитированием
Старый 18.11.2013, 22:55   #5
Диана Нестерова
Новичок
Джуниор
 
Аватар для Диана Нестерова
 
Регистрация: 17.11.2013
Сообщений: 4
По умолчанию

Цитата:
Никак. Одна из функций брандмауэра - запрещать левым программам открывать твои порты для подключения извне, потому было бы странно, если бы его можно было просто так отключать из твоего кода.
Да, но есть куча сетевых приложений, которые спокойненько работают и брандмауэр им нисколько не мешает.
Цитата:
В коде не так написано )
Ну и?
Диана Нестерова вне форума Ответить с цитированием
Старый 18.11.2013, 23:13   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
есть куча сетевых приложений, которые спокойненько работают и брандмауэр им нисколько не мешает.
Тебе ранно еще с брандмауером общаться ) Слепи хотя бы то что хочешь.
Цитата:
Ну и?
Ну и изначально ARequestInfo.Document равен / - это считается начальной страницей, как корневой каталог в Линуксе или Юниксе. Это нормально.
Потому в твоем случае его нужно отсекать, раз ты сам файл приписала.
Цитата:
web-сервер должен открыть в браузере web-страницу, лежащую на жестком диске, при запросе в браузере, моего собственного IP.
См. мой пример.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.11.2013, 23:20   #7
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

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

Цитата:
Ну и?
Ну и поле ARequestInfo.Document равняется '/'.
Результат выражения
Код:
'C:\Полигон\Web-server\Pilot\Test.htm' + ARequestInfo.Document
, очевидно, будет равен 'C:\Полигон\Web-server\Pilot\Test.htm/'. А / на \ уже делфи заменяет, видимо.
Son Of Pain вне форума Ответить с цитированием
Старый 19.11.2013, 20:00   #8
Диана Нестерова
Новичок
Джуниор
 
Аватар для Диана Нестерова
 
Регистрация: 17.11.2013
Сообщений: 4
По умолчанию

Цитата:
Только те, которые добавлены в список исключения брандмауэра. Он срабатывает всегда, когда какая-то программа пытается открывать сокет для принятия подключений извне, а таких программ у тебя не так много, думаю )
То есть, вы хотите сказать, что каждый разработчик сетевого приложения, несет свою программу куда-то в клювике и регистрирует ее? Не верю. Да это и невозможно, так как нет никакой Международной Ассоциации Брандмауэров. Это еще может быть в мире iOS, но не в мире Windows.

Цитата:
Ну и поле ARequestInfo.Document равняется '/'.
Результат выражения
Код:

'C:\Полигон\Web-server\Pilot\Test.htm' + ARequestInfo.Document

, очевидно, будет равен 'C:\Полигон\Web-server\Pilot\Test.htm/'. А / на \ уже делфи заменяет, видимо.
То есть, вы предлагаете ARequestInfo.Document убрать?
Диана Нестерова вне форума Ответить с цитированием
Старый 19.11.2013, 20:20   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
каждый разработчик сетевого приложения, несет свою программу куда-то в клювике и регистрирует ее?
Нет. Не несет. Но вот регистрирует ее пользователь при инсталляции, подтверждая это, и после первого запуска брандмауер спрашивает разрешения.
Разрешения дает пользователь а не сама программа.
Цитата:
То есть, вы предлагаете ARequestInfo.Document убрать?
Посмотри как я написал.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.11.2013, 01:17   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

просят разрешение только серверные программы, а не клиенты.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
web-сервер stck JavaScript, Ajax 2 10.12.2010 00:35
web-сервер stck Помощь студентам 0 08.12.2010 18:01
Сервер для web 2.0 Pan4o Компьютерное железо 1 09.09.2010 17:44
Не получается отправить сообщение на сервер zver777 Работа с сетью в Delphi 8 26.10.2009 22:42
Web сервер Briz Операционные системы общие вопросы 3 13.11.2007 10:10