![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
сокеты и web service [D6, Win2k]
Lesorub © (2006-11-16 18:34:00)Вот у меня в сетке есть web-сервер (апач на winnt). Хотелось бы чтобы web service на нем, при обращении клиента, брал с другого сервера в сетке (где БД) данные. Для этого я попробовал использовать ClientSocket поместив его в Web-module web service 'а, как это делается в обычных приложениях. Компиляция прошла без проблем, но при запросе программки-клиента, когда происходило событие ClientSocket.Open, выскочила ошибка Access Violation at address такого-то in module таком-то. Read of address такой-то. И информации толком нигде нет по этой теме, в общем, плз, very need help )
Плохиш (2006-11-18 22:26:00) [21]
> MikePetrichenko © (18.11.06 21:43) [23]
> Не парься с WebModule. CGI пишется весь ручками. От начал
> и до конца. Иначе будут головные боли.
Не пугай мальчика :-)
> Lesorub © (18.11.06 16:57) [20]
Вот, почитай http://delphi.about.com/od/webservices/
MikePetrichenko (2006-11-18 21:43:00) [22]
> Lesorub © (18.11.06 16:57) [20]
Не парься с WebModule. CGI пишется весь ручками. От начал и до конца. Иначе будут головные боли.
Lesorub (2006-11-18 20:15:00) [23]ну и глупость предыдущий сабж :-)
Lesorub (2006-11-18 17:21:00) [24]Хм, или надо объявить как переменную типа Socket1 ?
Lesorub (2006-11-18 16:57:00) [25]Вот созрел ответ )
CGI-модуль создается в виде исполняемого файла и запускается на выполнение как независимый процесс. В моем случае обычного CGI-интерфейса запрос и сформированный ответ передаются через стандартный консольный ввод/вывод. А выгружает, надо понимать, по завершении работы исполняемого файла. Насколько я читал это верно не только для апача, но и вообще для любых web-серверов которые работают с cgi.
Сокет объявляется так:
type
TWebModule1 = class(TWebModule)
Socket1: TClientSocket; { эта строка появляется автоматически при перетаскивании компонента на webmodule }
То же самое и при перетаскивании на форму в обычных приложениях, только вместо class(TWebModule) конечно же class(TForm).
Alexey (AZ), вот может действительно так и надо сделать, потому как нет уверенности, что при помещении компонента на webmodule, он автоматически создается. Если нет автосоздания то это наверное связано со спецификой webmodule. Хотя, странно, что это может помешать автосозданию.
И, если можно, объясните как создать вручную, в литературе все практически начинается с того что компонент создается автоматически при перетаскивании.
Alexey (AZ) (2006-11-18 16:15:00) [26]Автору:
Я так думаю, что надо создать сокет вручную. Т.к. сервис не предполагает наличае чего-либо визуального, то может быть что сокет не создается, в отличае от формы, где после её создания происходит автосоздание компонент, расположеных на ней.
MikePetrichenko (2006-11-17 16:53:00) [27]
> Все это делается в виде cgi.
Прочти как создаются и запускаются модули cgi под Apach, когда он их выгружает. Нужен ли код инициализации.
Приведи код инициализации своего cgi приложения. Покажи как объявлен Socket1 и где он создается.
Lesorub (2006-11-17 16:27:00) [28]А как это проверить? дебаггером?
Сергей М. (2006-11-17 16:05:00) [29]
> не понятно почему он может не существует
Ну откуда ж мне знать ? То ли не создан он, то ли потерян ...
Впрочем объект-то может и существует, но вот поле Socket1 почему-то содержит nil или "мусор" ... Проверь это сам ...
Lesorub (2006-11-17 16:01:00) [30]MikePetrichenko, конечно все уже есть, но цель в том чтобы delphi изучить получше в этом плане. Apach + PHP + MySQL это конечно хорошо, и в нормальных работах так и надо делать, но моя цель повторюсь delphi поизучать, так сказать, под разными углами. И все бы хорошо, только с этой проблемой сложность, вот и хочется разобраться.
Все это делается в виде cgi.
Сергей М., если честно, то не понятно почему он может не существует, если не трудно, объясните подробней, плз. )
Сергей М. (2006-11-17 08:10:00) [31]
> Socket1.Open; { <--ошибка происходит здесь, причем сокет
> заранее настроен как надо }
Это означает, что объект Socket1 не существует.
MikePetrichenko (2006-11-17 06:47:00) [32]
> В обычном приложении, НЕ web-сервисе, без проблем работает,
> а в web-сервисе вышеописанная ошибка
Да, и вдогонку. Ты его как что лепишь? Как MOD для Apach или как cgi приложение?
MikePetrichenko (2006-11-17 06:34:00) [33]
> Вот у меня в сетке есть web-сервер (апач на winnt). Хотелось
> бы чтобы web service на нем, при обращении клиента, брал
> с другого сервера в сетке (где БД) данные. Для этого я
> попробовал использовать ClientSocket поместив его в Web-
> module web service'а, как это делается в обычных приложениях.
> Компиляция прошла без проблем, но при запросе программки-
> клиента, когда происходило событие ClientSocket.Open, выскочила
> ошибка Access Violation at address такого-то in module таком-
> то. Read of address такой-то. И информации толком нигде
> нет по этой теме, в общем, плз, very need help )
Даже полную цитать привел...
Большего бреда не читал. Это же надо так извратиться. А чем Apach + PHP + MySQL (FB/MSSQL/Oracle) не устраивает?
Все уже написано до нас.
Lesorub (2006-11-17 05:43:00) [34]В обычном приложении, НЕ web-сервисе, без проблем работает, а в web-сервисе вышеописанная ошибка
Lesorub (2006-11-16 22:33:00) [35]На всякий случай дополнительная информация, упрощенный вариант кода web-сервиса:
{ то что в модуле с описанием TWebModule1 = class(TWebModule), т.е. "главный" модуль }
function TWebModule1.Conn: String; //моя функция
begin
Socket1.Open; { <--ошибка происходит здесь, причем сокет заранее настроен как надо }
Conn:='ok';
end;
procedure TWebModule1.WebModuleDestroy(Sender: TObject);
begin
Socket1.Close;
end;
//=======
//а это из модуля с обработчиком запроса
type
TPage = class(TInvokableClass, IPage)
function Base(Start: boolean): String; stdcall;
end;
...
//обработчик, выполняемый при запросе клиентской программки
function TPage.Base(Start: boolean): String;
var
Post:TStrings;
begin
Result:= WebModule1.Conn;
end;
// и стандартно инициализация
initialization
InvRegistry.RegisterInvokableClass(TPage);
Итак если все без ошибок то, результатом должно быть соединение с сервером и значение переменной = 'ok'
Суслик (2006-11-16 22:16:00) [36]Попробуй.
Дельфи 2006 пользуется именно jedi для построения стека вызовов функций. Там, правда, много мусора. Некоторые функции вроде бы не должны включаться, но включаются - возможно это связано с тем, что я плохо знаю asm, и как следствие функции все-таки должны включаться. Но, все функции через которые прошел вызов в стеке будут. Кроме некоторых из vcl.
Все же, вполне информативно.
Lesorub (2006-11-16 22:11:00) [37]Спасибо, надо попробовать. Но топик пока не закрываем :-)
Суслик (2006-11-16 21:52:00) [38]
> Почему же плохо? И никакого решения для такой ситуации нет?
У тебя явная ошибка в программе.
Вообще адреса, указанные в сообщении достаточно информативны. По ним можно понять (не всегда, правда), из какого исполняемого модуля (не путать с модлями дельфи) было некорректное обращение. ДЛя просмотра всех загруженный модулей для твоей программы ты можешь использовать утилиту processexplorer из www.sysinternals.com.
А вообще - скачай себе jedi (ищи на www.sourceforge.net) и вставь логирование стека ошибок при исключении. Очень полезная весчь. Денек поразбираешься с jedi, зато потом подобные ошибки будешь находить значительно проще.
У jedi есть пример в jcl\experts\debug\dialog\ExceptDlg.pas как получить стек вызовов при исключении. Но это форма. Тебе никто не мешает самому вызвать JclLastExceptStackList в своем сервисе.
Lesorub (2006-11-16 21:46:00) [39]Это да, а каким-либо другим способом запустить сокет на стороне сервера, нет? Может webmodule в принципе не совместим с сокетами? Хотя это, честно говоря, было бы странно.
Anatoly Podgoretsky (2006-11-16 21:37:00) [40]> Lesorub (16.11.2006 20:57:04) [4]
Потому что это шифровка, по ней никаких выводов сделать нельзя.