Тема: HTA: Мультисокетный WEB сервер в HTA
Доброго времени суток товарищи.
Вступление
Всем кому влом читать всю дальнейшую ахинею - ниже ссылка на архив того, что получилось - Мультисокетный WEB сервак.
Простенький пока что. Грузит HTML-ки, картинки и просто файлы. В дальнейшем хочу добавить обработку запроса 206 для докачки файла, обработку ASP (Предполагаю, что ScriptControl вполне подойдёт) ну и остальные функции.
Админам и модераторам: Заранее прошу прощения, что не кинул сразу в коллекцию, т.к надеюсь на активное участие разработчиков и помощь в доделке, а в коллекции дискуссии запрещены.
В архиве:
Server.hta - сам сервак.
Stop server.vbs - скрипт остановки сервера (в принципе скрипт получает полный доступ к объектам в Server.hta, так что потом можно сделать полноценное управление сервером, а так же наблюдать за состоянием всех сокетов)
Socket.wsc - "волшебный" контейнер сокета
каталог wwwroot - в нём странички и картинки
Что запускать ?
1) Запускать - Server.hta
2) Если никаких ошибок не вылезло (компонетов нужных нет или ещё что то), то зайти в браузер и набрать http://localhost
3) В идеальном случае должна появиться главная страница сайта
* Если ошибок не произошло, но и страница не грузится - возможно у вас в брандмауэре не разрещён 80 порт. Его нужно добавить в исключения
Как всё делалось иля левой ногой за правым ухом. Уж очень захотелось поделиться переживаниями ))
Тут в голову стукнула идея попробывать создать скриптовый WEB сервер. Думаю такая идея посещала не только меня и наверняка уже были такие реализации. Ведь в принципе всё для этого есть. Winsock отлично с этим справляется. Но всё же решил и сам попробывать. Упёрся в то, что винсок один и если на него "толпой" запросы накидать, то он не справится конечно, а "настоящий" веб сервер конечно делает множество сокетов для обработки запросов. Попытался создать массив сокетов и повесить их все на одни и теже события. Вешаться то они вешаются, но только в самом событии узнать какой из объектов его породил - я никак не мог.
. Попробывал в каждом событии по циклу прогонять сокеты и смотреть их состояние. Тормоза.... и сбои... Т.к несколько сокетов могут иметь одинаковое состояние в одно и тоже время. Так что не вариант... В идеальном случае хотелось бы, чтобы в каждое событие передавалась ссылка на объект сгенеривший событие (EventObject), но исходные события винсока я поправить не могу. Стал думать. Вспомнил про всемогущий WSC. Ведь в нём можно так же ловить события от объектов:
<object id="Winsock" progid="MSWinsock.Winsock" events="True" />Создал Socket.WSC. Стал думать как высунуть его события обратно в скрипт. И тут новая проблема: События у WSC не имеют параметров. Т.е нельзя сделать FireEvent(EventName,param1,param2), а можно только FireEvent("EventName"). Стал думать - как бы зацепиться за процедуры в скрипте. Почитал ещё структуру WSC и наткнулся на статью где в WSC передают объект WScript. Отлично ! Передал... Но у WScript нет связки с процедурами в скрипте. Т.е нельзя сделать WScript.MyProc Мда... Но ведь процедуры принадлежат к кому то. Конечно принадлежат. Они связаны с объектом Me ! Попробывал в скрипте вызвать Me.MyProc. Однако ж работает !. Передал объект Me в WSC. Завязал события:
Private Sub Winsock_ConnectionRequest(ByVal requestID)
Script.Socket_ConnectionRequest Self, requestID
End SubСразу возникает вопрос (наверное
), что за объекты Script и Self в коде. Script - это Me из родительского скрипта, а Self - это ссылка на Me от cамого WSC. Решил передавать её как ссылку на сокет. Мда... не совсем понятно наверное. В общих чертах - Socket.WSC ловит стандартные события винсока внутри себя и через связку со скриптом транслирует их в процедуры в server.hta.
Не захотелось мне все свойства винсока описывать в WSC, поэтому просто высунул его как property
<property name="Winsock" />В итоге в самом скрипте я получил
Sub Socket_ConnectionRequest(EventObject, requestID)
End SubEventObject и есть ссылка на сам сокет, а EventObject.Winsock - ссылка на Винсок внутри сокета.
Ну а дальше обычная обработка каждого сокета.
Первый стоит постоянно на прослушке, а DataArrival раздаёт остальным сокетам коннект.
Под конец добавил стандартную связку HTA и скрипта для остановки сервера через WebBrowser control. Если кто не знает - вот тема где это обсуждалось:просмотреть
Вот вроде и всё. ![]()
P.S Очень жду отзывов, предложений по модификации и улучшению. С радостью готов ответить на любые вопросы - если что то непонятно расписал. Потому как расписал не всё. Слишком много получится. ))

