В данном разделе мы предполагаем, что вы имеете установленный сервер jCjS. Далее мы рассмотрим начальные приемы программирования и настройки сервера jCjS. Файлы примеров можно найти в папках сервера stuff/examples/[раздел].
Основные (можно сказать стартовые) настройки jCjS хранятся в файле jcjs.xml, который находится папке etc, которая, в свою очередь, может находится либо рядом с исполняенмым файлом сервера, либо в /etc/jcjs/ для Linux варианта, либо в ... для Windows варианта. Из соображений безопасности администратору системы следует назначить права чтения так, чтобы этот файл мог быть прочитан только исполняемым файлом сервера либо суперпользователем, так как в нем могут хранится различные пароли и ключи шифрования, которые лучше скрыть от посторонних глаз. Далее мы предполагаем, что у вас есть права на чтение и изменение файла настройки jcjs.xml.
Переименуем текущий файл настройки jcjs.xml в нечто типа jcjs(копия).xml, дабы сохранить его содержимое для дальнейших нужд и создадим новый(а лучше воспользоваться готовым stuff/examples/helloWorld/jcjs.xml) в который впишем следующий текст:
<?xml version="1.0" encoding="UTF-8"?>
<jCjS>
<post
objectName = "helloWorld"
description = "hello World post"
portDebug = "0"
debug = "false"
defDirs = "stuff@examples/helloWorld"
>
<handlers
cmd = "cmd.js"
/>
</post>
</jCjS>
Детальное описание конфигурационного файла (см. раздел Конфигурация)
Текст должен быть записан в "чистом" текстовом редакторе в кодировке UTF-8. Данная кодировка является единственное поддерживаемой сервером jCjS, так что пользователям Windows нужно озаботится поиском такового, так как notepad поддерживает только CP-1251. А вот, к примеру, notepad+ - поддерживает. Еще раз убедитесь, что вы сохраняете файл в UTF-8. Также Вам следует знать базовые понятия языка разметки XML, чтобы понимать дальнейшее изложение материала и правильно расставлять скобочки и кавычки.
Итак, jCjS начинает свою работу с чтения файла jcjs.xml, и в зависимости от его содержимого создает внутри себя соответствующие объекты с соответствующими настройками. Исходя из беглового взгляда на Листинг 1 можно прийти к выводу, что внутри родительского узла jCjS объявлен узел типа <post> с атрибутом objectName = "helloWorld" - именем некоторого объекта и еще узел post содержит дочерний узел <handlers> с одним атрибутом cmd = "stuff@examples/helloWorld/cmd.js". Судя по записи наклонных черт и конечного расширения ".js" этот атрибут указывает на некий файл, и этот файл есть JavaScript. Попробуем его найти: смотрим папку stuff относительно исполняемого файла jCjS, далее examples, далее helloWorld... да файл cmd.js имеется. Может показаться странным зачем указана собака в этом пути. Это сделано для того, что папка stuff может находится в совершенно другом месте файловой системы, как это сделать мы в дальнейшем рассмотрим.
Давайте откроем найденный файл для просмотра и увидим там одну единственную строку:
http.respPlainText('Hello World!');
Эта строка предписывает вызов функции respPlainText() объекта http с аргументом 'Hello World!'. Чтобы понять, что это значит нужно запустить сервер. Запустим консольный вариант сервера jCjS:
cd /home/jcjs/bin ./jCjSService -e -cfg ../stuff/examples/helloWorld/jcjs.xml ------------------------------------------------------------------------------------------------------------------------------------------- jCjSService.exe | Версия ПО: jCjS v.2.4.8.344 (сборка от 31.12.2014 16:01:40) | Revision SVN 344 | Powered by Qt486-msvc2010 ------------------------------------------------------------------------------------------------------------------------------------------- 17:18:30.330 +1 jcjshttpserver.cpp:569 jCjSHttpServer::init() server: главный конфиг '../stuff/examples/helloWorld/jcjs.xml' 17:18:30.331 +0 jcjshttpserver.cpp:574 jCjSHttpServer::init() server: по умолчанию порог логирования: 2 17:18:30.332 +0 jcjshttpserver.cpp:587 jCjSHttpServer::init() server: локаль по умолчанию: Russian 17:18:30.333 +0 jcjshttpserver.cpp:599 jCjSHttpServer::init() server: язык по умолчанию: ru 17:18:30.335 +0 jcjshttpserver.cpp:612 jCjSHttpServer::init() server: фильтр повторяющихся сообщений по умолчанию: 360 сек 17:18:30.336 +0 jcjshttpserver.cpp:635 jCjSHttpServer::init() server: накопительная емкость для вывода лога по http: 16 17:18:30.337 +0 jcjshttpserver.cpp:654 jCjSHttpServer::init() server: дефолтные файлы по умолчанию: index.html index.htm 17:18:30.338 +0 jcjshttpserver.cpp:669 jCjSHttpServer::init() server: port по умолчанию 8080 17:18:30.342 +1 jcjshttpserver.cpp:707 jCjSHttpServer::init() server: открыт порт 8080 для прослушивания 17:18:30.344 +1 jcjshttpserver.cpp:720 jCjSHttpServer::init() server: сжатие WEB содержимого: true 17:18:30.345 +0 jcjshttpserver.cpp:728 jCjSHttpServer::init() server: папка data по умолчанию C:/Proj/jCjS2/_dest_dir/data 17:18:30.347 +0 jcjshttpserver.cpp:739 jCjSHttpServer::init() server: папка stuff по умолчанию C:/Proj/jCjS2/_dest_dir/stuff 17:18:30.348 +0 jcjshttpserver.cpp:750 jCjSHttpServer::init() server: папка stat по умолчанию ../stat/ 17:18:30.350 +0 jcjshttpserver.cpp:762 jCjSHttpServer::init() server: каталоги inc по умолчанию ../stuff/include/ ../stat/js/ 17:18:30.352 +1 jcjspost.cpp:86 jCjSPost::jCjSPost() helloWorld: создан объект поста helloWorld 17:18:30.353 +1 jcjspost.cpp:92 jCjSPost::jCjSPost() helloWorld: дефолтный каталог 'stuff@examples/helloWorld/' ******************************************************************************************************************************************* 17:18:30.356 +1 jcjspost.cpp:294 jCjSPost::init() helloWorld: инициализация поста 17:18:30.358 +1 jcjspost.cpp:497 jCjSPost::setDefDirs() helloWorld: установлен дефолтный каталог 'stuff@examples/helloWorld/' 17:18:30.360 +1 jcjspost.cpp:418 jCjSPost::init() helloWorld: выполнить инициализирующий скрипт 17:18:30.362 +1 jcjspost.cpp:424 jCjSPost::init() helloWorld: инициализирующий скрипт "успеx" 17:18:30.362 +1 jcjshttpserver.cpp:1340 jCjSHttpServer::sl_status() server: пост helloWorld: инициализия 'успешно' 17:18:30.364 +1 jcjspost.cpp:433 jCjSPost::init() helloWorld: инициализация завершена 17:18:30.365 +1 jcjshttpserver.cpp:1044 jCjSHttpServer::init() server: инициализация завершена -------------------------------------------------------------------------------------------------------------------------------------------
Инициализация прошла успешно, но многие параметры приняты по умолчанию,
т.к. в конфигурационном файле не описана секция <server>.
Проверка: откройте интернет браузер, и введите http://127.0.0.1:8080,
вы должны увидеть текст аргумента функции respPlainText() - Hello World!
Если у Вас есть еще один компьютер в локальной сети или статический адрес в интернете - зайдите на свой сайт
извне и убедитесь, что сервер исправно выполняет свои функции.
Тем временем, пока происходило тестирование сервера, консоль наполнялась примерно таким содержанием:
----------------------------------------------------------------------------------------------------------------------------------- 19:55:53.756 Info jcjshttpconnection.cpp:108 jCjSHttpConnection() http: новое соединение 10.7.97.148 19:55:53.759 Debg jcjshttpserver.cpp:1616 formResponse() server: запрос от 10.7.97.148:GET / HTTP/1.1 19:55:57.435 Debg jcjshttpserver.cpp:1616 formResponse() server: запрос от 10.7.97.148:POST / HTTP/1.1 19:56:01.936 Warn registration.js:87 makeRegistration() postsTable: вошел в систему Администратор: 'Admin' c 10.7.97.148 19:56:01.945 Debg jcjshttpserver.cpp:1616 formResponse() server: запрос от 10.7.97.148:GET /postsTable/ HTTP/1.1 19:56:02.026 Debg jcjshttpserver.cpp:1616 formResponse() server: запрос от 10.7.97.148:GET /postsTable/js/post.script.js HTTP/1.1 19:56:02.065 Debg jcjshttpserver.cpp:1616 formResponse() server: запрос от 10.7.97.148:GET /postsTable/?jsonPostsTable HTTP/1.1 19:56:04.085 Debg jcjshttpserver.cpp:1616 formResponse() server: запрос от 10.7.97.148:GET /helloWorld/ HTTP/1.1 -----------------------------------------------------------------------------------------------------------------------------------
Проведите эксперимент: не оставливая сервер, измените файл cmd.js, например, так:
http.respPlainText('Привет мир!');
Обновите страницу в браузере и убедитесь, что русский шрифт отображается правильно. Сейчас для нас важно отметить, что файл скрипта cmd.js каждый раз заново перечитывается и выполняется в результате запроса на сервер. Чтобы еще раз убедится в этом, данный скрипт можно видоизменить и так:
var time = new Date();
http.respPlainText(
time.getHours() + ':' +
time.getMinutes() + ':' +
time.getSeconds()
);
Теперь при каждом обновлении страницы будет отображено время сервера.
Ну и третий эксперимент: зададим URL в запросе например так: http://62.182.51.71:8080/step, обновляем - тоже самое; или так: http://62.182.51.71:8080/qwerty?a=100 - и опять время. Для тех кто администрировал обычные http сервера, например, appache - это может показаться странным, но в jCjS это так (хотя ето обычное поведение для всех http серверов), и в дальнейшем мы поймем почему это так.
Механизм работы прост: сервер слушает входящие соединения по порту 8080. Браузер запрашивает соединение у сервера jCjS. В ответ на запрос соединения, сервер создает объект соединения и начинает принимать запросы HTTP. В момент, когда заголовок и тело запроса полностью приняты, параметры HTTP парсятся и в контекст скрипта добавляется объект http, который мы и использовали выше для отправки ответа клиенту. Но мы не использовали никакие свойства http и отвечали всегда одним и тем же: http.respPlainText('Привет мир!').
Чтобы продемонстрировать свойства http можно переделать текущий cmd.js в:
var str = JSON.stringify(http, null, 2); http.respPlainText(str);
А можно воспользоваться готовым cmdHttp.js из той же папки stuff@examples/helloWorld/. Для этого, как Вы возможно уже догадываетесь, нужно подкорректировать jcjs.xml и, в этом случае, перезапустить сервер.
<?xml version="1.0" encoding="UTF-8"?>
<jCjS>
<post
objectName = "helloWorld"
>
<handlers
cmd = "cmdHttp.js"
/>
</post>
</jCjS>
Детальное описание конфигурационного файла (см. раздел Конфигурация)
Задайте в браузере к примеру такой запрос http://127.0.0.1:8080/step/go?a=100&b=20 и внимательно изучите ответ. Задайте другие запросы и с другого браузера, внимательно изучите текст Листинг 8 и ответ сервера на различные запросы.
В отличие от традиционных HTTP серверов jCjS не делает соответствия локальной подпапки файловой системы с указанным URL ресурсом. Это связано с тем, что jCjS в первую очередь предназначен для управления оборудованием и в этом случае путь запроса может быть связан с некоторой группой параметров прибора и их значениями, но не как не с локальной папкой файловой системой. Все дерево типов ответов на конкретный URL строится написанием соответствующего командного скрипта. А на случай отсутствия какого-либо ресурса объект http содержит средство ответа http.respError(404). Далее мы продолжим изучение свойств и методов объекта http.