МногопоточныйTCPСерверSSL (MultithreadedTCPServerSSL) Конструктор

Синтаксис

МногопоточныйTCPСерверSSL(<НомерПорта>, <ПутьСертификата>, <Пароль>)

Параметры

НомерПорта (обязательный)
Тип: Число.
Прослушиваемый TCP-порт для входящих запросов на подключение на сервере.
ПутьСертификата (необязательный)
Тип: Строка.
Путь до файла сертификата .pfx. По умолчанию будет использован файл сертификата с именем certificate.pfx, лежащий в том же каталоге, что и запускаемый сценарий.
Пароль (необязательный)
Тип: Строка.
Пароль для сертификата. Здесь конечно нужно предварительно организовать запрос пароля, чтобы сохранить секретность пароля в контексте сценария. По умолчанию в тестовых примерах будет использован пароль "swordfish20231223".

Описание

Создаёт новый экземпляр класса МногопоточныйTCPСерверSSL (MultithreadedTCPServerSSL).

Примечание

Цикл ожидания событий сервера остановит выполнение скрипта. Если нужно продолжение выполнения скрипта после запуска сервера создавайте сервер через метод ФоновыйМногопоточныйСерверSSL (BackgroundMultithreadedServerSSL).

Если потребуется организовать безопасный ввод пароля можно воспользоваться библиотекой Текстовый пользовательский интерфейс (TUI) для сценарного языка OneScript. Пример смотрите в Секретный ввод пароля..

Пример

Сервер = МС.МногопоточныйСерверSSL(8080);
Полный пример кода


// Этот сервер можно запускать для тестирования клиентов. // В ответ на сообщения клиентов сервер будет пересылать сообщение // как самому клиенту, так и всем подключенным клиентам. Перем МС, Сервер; Процедура ПриПодключенииКлиента() Экспорт АргументыСобытия = МС.АргументыСобытия; Сообщить("Клиент подключился: " + АргументыСобытия.ИдентификаторКлиента); Сообщить("Активных клиентов: " + Сервер.КоличествоАктивныхКлиентов); Сообщить("========================"); КонецПроцедуры Процедура ВывестиСообщение(Данные, ИдентификаторКлиента) Попытка РазмерДанных = Данные.ПрочитатьЦелое32(0); ДанныеСообщения = Данные.Прочитать(4, РазмерДанных); ДД = ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(ДанныеСообщения); ОтдельноеСообщение = ПолучитьСтрокуИзДвоичныхДанных(ДД, КодировкаТекста.UTF8); Сообщить("Сообщение от " + ИдентификаторКлиента + " (" + РазмерДанных + " байт):" + Символы.ПС + ОтдельноеСообщение); Если (Данные.Размер - 4 - РазмерДанных) > 0 Тогда ОстатокДанных = Данные.Прочитать(4 + РазмерДанных, Данные.Размер - 4 - РазмерДанных); ВывестиСообщение(ОстатокДанных, ИдентификаторКлиента); КонецЕсли; Исключение ДанныеСообщения = Данные.Прочитать(0, Данные.Размер); ДД = ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(ДанныеСообщения); ОтдельноеСообщение = ПолучитьСтрокуИзДвоичныхДанных(ДД, КодировкаТекста.UTF8); Сообщить("Сообщение от " + ИдентификаторКлиента + " (" + Данные.Размер + " байт):" + Символы.ПС + ОтдельноеСообщение); КонецПопытки; КонецПроцедуры Процедура СерверПолучилДанные() Экспорт АргументыСобытия = МС.АргументыСобытия; Данные = АргументыСобытия.Данные; // Данные, полученные сервером, доступны нам как тип БуферДвоичныхДанных (BinaryDataBuffer). // Если с сервером будет взаимодействовать клиент, который формирует сообщения по оговоренным заранее правилам, // появляется возможность делить данные на отдельные сообщения и кроме того знать тип данных отдельного сообщения. // Как частный случай можно на стороне клиента отправлять в сетевой поток сначала размер сообщения (четыре байта) // а затем само сообщение. В этом примере так и сделано. // Разобъем полученные сервером данные на отдельные сообщения. ВывестиСообщение(Данные, АргументыСобытия.ИдентификаторКлиента); // Отправим всем строку. Сервер.ОтправитьВсем("От сервера всем: " + Символы.ПС + ПолучитьСтрокуИзБуфераДвоичныхДанных(Данные)); // Отправим клиенту. Сервер.ОтправитьКлиенту(АргументыСобытия.ИдентификаторКлиента, "dddd От сервера клиенту " + АргументыСобытия.ИдентификаторКлиента + ": " + Символы.ПС + ПолучитьСтрокуИзБуфераДвоичныхДанных(Данные, КодировкаТекста.UTF8)); // Сервер.ОтправитьКлиенту(АргументыСобытия.ИдентификаторКлиента, Данные); Сообщить("========================"); КонецПроцедуры Процедура ПриОтключенииКлиента() Экспорт АргументыСобытия = МС.АргументыСобытия; Сообщить("Клиент отключился: " + АргументыСобытия.ИдентификаторКлиента); Сообщить("Активных клиентов: " + Сервер.КоличествоАктивныхКлиентов); Сообщить("========================"); КонецПроцедуры Процедура ПриОшибкеСервера() Экспорт АргументыСобытия = МС.АргументыСобытия; Сообщить("ОшибкаСервера: " + АргументыСобытия.ОшибкаСервера); Сообщить("========================"); КонецПроцедуры Процедура ЗапускМногопоточногоСервера(параметр1, параметр2) Экспорт Контекст = Новый Структура(); Контекст.Вставить("МС", параметр1); Контекст.Вставить("Сервер", параметр2); Стр = " | |Процедура Сервер_ПриПодключенииКлиента() Экспорт | МС.ОбработатьПриПодключенииКлиента(МС.АргументыСобытия); |КонецПроцедуры | |Процедура Сервер_ПриОтключенииКлиента() Экспорт | МС.ОбработатьПриОтключенииКлиента(МС.АргументыСобытия); |КонецПроцедуры | |Процедура Сервер_СерверПолучилДанные() Экспорт | МС.ОбработатьСерверПолучилДанные(МС.АргументыСобытия); |КонецПроцедуры | |Процедура Сервер_ПриОшибкеСервера() Экспорт | МС.ОбработатьПриОшибкеСервера(МС.АргументыСобытия); |КонецПроцедуры | |Сервер.ПриПодключенииКлиента = МС.Действие(ЭтотОбъект, ""Сервер_ПриПодключенииКлиента""); |Сервер.ПриОтключенииКлиента = МС.Действие(ЭтотОбъект, ""Сервер_ПриОтключенииКлиента""); |Сервер.СерверПолучилДанные = МС.Действие(ЭтотОбъект, ""Сервер_СерверПолучилДанные""); |Сервер.ПриОшибкеСервера = МС.Действие(ЭтотОбъект, ""Сервер_ПриОшибкеСервера""); |Сервер.Начать(); | |Пока МС.Продолжать Цикл | МС.ПолучитьСобытие().Выполнить(); |КонецЦикла; |"; ЗагрузитьСценарийИзСтроки(Стр, Контекст); КонецПроцедуры ПодключитьВнешнююКомпоненту("C:\444\111\MultithreadedTCPServer\MultithreadedTCPServer\bin\Debug\MultithreadedTCPServer.dll"); МС = Новый МногопоточныйTCPСерверДляОдноСкрипта(); Сервер = МС.МногопоточныйСерверSSL(8080); МассивПараметров = Новый Массив(2); МассивПараметров[0] = МС; МассивПараметров[1] = Сервер; Задание = ФоновыеЗадания.Выполнить(ЭтотОбъект, "ЗапускМногопоточногоСервера", МассивПараметров); МС.ПриОшибкеСервера = МС.Действие(ЭтотОбъект, "ПриОшибкеСервера"); МС.ПриОтключенииКлиента = МС.Действие(ЭтотОбъект, "ПриОтключенииКлиента"); МС.СерверПолучилДанные = МС.Действие(ЭтотОбъект, "СерверПолучилДанные"); МС.ПриПодключенииКлиента = МС.Действие(ЭтотОбъект, "ПриПодключенииКлиента"); // // Для визуализации активности клиентов можно включить это свойство. Сервер.ПроверятьАктивностьКлиента = Истина; Пока Истина Цикл Приостановить(100); КонецЦикла;

Смотрите также

Библиотека MultithreadedTCPServer