Предистория.
После написания библиотеки форм (OneScriptForms) и дизайнера форм (OneScriptFormsDesigner) возникла мысль о применении всего этого не ограничиваясь пределами одного компьютера. То есть пойти дальше в плане расширения функциональности и обеспечить сетевую работу библиотеки форм. Лучшим примером было бы создание чата. OneScript и некоторые библиотеки для него имеют возможность создавать потоковую передачу данных между сервером и клиентом. В моём случае их функционала было недостаточно, поэтому после поиска в сети и изучения материалов по клиент-серверным разработкам написал собственную библиотеку OneScriptClientServer.
Что мы имеем в итоге.
В итоге мы имеем возможность создать клиент-серверное приложение с использованием библиотеки форм для односкрипта и возможностью запуска на платформах Linux и Windows. Использование графического интерфейса не обязательно, всё зависит от поставленной задачи.
Есть два варианта использования библиотеки - в режиме приложения и в обычном режиме клиент-сервера.
Что позволяет режим приложения.
1. Создать многопоточный TCP сервер (ПриложениеСервис). На стороне сервера для каждого клиента создается выделенный сокет, асинхронно работающий с клиентом.
2. Создать TCP клиент (ПриложениеКлиент), который подключившись к серверу может вызывать на исполнение (в контексте скрипта сервера) его методы. При этом можно в метод передать параметры и получить результат выполнения метода.
3. TCP клиент, подключившись к серверу может вызывать на исполнение (в контексте скрипта удаленной машины) методы другого TCP клиента, подключенного к этому же серверу. При этом так же можно в метод передать параметры и получить результат выполнения метода.
Что позволяет режим клиент-сервера.
1. Подключение к серверу множества клиентов и обмен с ними сообщениями. Под сообщением подразумевается объект – экземпляр определенного класса. Отправляемые данные при этом предварительно обрабатываются. Можно отправлять такие типы данных как ДвоичныеДанные (для передачи файлов в том числе), Булево, Дата, Строка, Число.
2. Подключение к серверу таких клиентов как браузер, или например объект TCPСоединение (TCPConnection) из библиотеки односкрипта. Данные такого клиента отправляются в коммуникационный поток без предварительной обработки.
Каждый вариант подразумевает использование разных классов клиента и сервера.
При замерах на моем компьютере за одну секунду сервер подключил 1700 клиентов. В другом замере клиент успешно послал 15000 коротких текстовых сообщений за одну секунду. И клиент и сервер при замерах были запущены на одном и том же компьютере. Код замеров находится в справке к библиотеке.
Поддерживается обработка событий. Подключение/отключение к серверу, отправка/получение сообщения и другие события можно связать с методами скрипта и задать необходимый алгоритм поведения приложения.
Примеры кода.
Создаем и запускаем сервер.
Перем КС;
Процедура ПриложениеСервис_ПриПодключенииКлиента() Экспорт
ПриложениеКлиентАрг = КС.АргументыСобытия;
Сообщить("Подключен новый клиент. Идентификатор клиента = " + ПриложениеКлиентАрг.Клиент.ИдентификаторКлиента);
Сообщить("ГуидКлиента = " + ПриложениеКлиентАрг.Клиент.ГуидКлиента);
КонецПроцедуры
ПодключитьВнешнююКомпоненту("ВашКаталогНаДиске\OneScriptClientServer.dll");
КС = Новый КлиентСерверДляОдноСкрипта();
ПриложениеСервис1 = КС.ПриложениеСервис(10085, ЭтотОбъект);
ПриложениеСервис1.ПриПодключенииКлиента = Новый Действие(ЭтотОбъект, "ПриложениеСервис_ПриПодключенииКлиента");
ПриложениеСервис1.Начать();
Пока КС.Продолжать Цикл
КС.ПолучитьСобытие().Выполнить();
КонецЦикла;
Создаем и запускаем клиент.
Перем ПриложениеКлиент1;
Процедура ПриложениеКлиент1_ПриПодключении() Экспорт
Сообщить("Я подключился. Гуид = " + ПриложениеКлиент1.ГуидКлиента);
КонецПроцедуры
ПодключитьВнешнююКомпоненту("ВашКаталогНаДиске\OneScriptClientServer.dll");
КС = Новый КлиентСерверДляОдноСкрипта();
ПриложениеКлиент1 = КС.ПриложениеКлиент(КС.TCPКонечнаяТочка("127.0.0.1", 10085), ЭтотОбъект);
ПриложениеКлиент1.ПриПодключении = Новый Действие(ЭтотОбъект, "ПриложениеКлиент1_ПриПодключении");
ПриложениеКлиент1.Подключить();
Пока КС.Продолжать Цикл
КС.ПолучитьСобытие().Выполнить();
КонецЦикла;
Исходный код доступен на github (OneScriptClientServer). Там же найдете ссылку на документацию (Справка). Документация содержит подробные примеры.
Пример заготовки чата с использованием графического интерфейса (GUI): https://ahyahy.github.io/OneScriptClientServer/OSClientServerRu//OSClientServerExampleChat.html.