Внешняя компонента WebSocketClient

Публикация № 1112969

Разработка - Разработка внешних компонент

WebSocket вебсокет Web-Socket веб-сокет

13
Синхронный и асинхронный обмен данными по протоколу WebSocket

Протокол WebSocket («вебсокет»), описанный в спецификации RFC 6455, обеспечивает возможность обмена данными между браузером и сервером через постоянное соединение. Данные передаются по нему в обоих направлениях в виде «сообщений», без разрыва соединения и дополнительных HTTP-запросов. WebSocket особенно хорош для сервисов, которые нуждаются в постоянном обмене данными (например, торговые площадки, работающие в реальном времени).

Компонента WebSocketClient содержит два вида объектов:

  • WebSocketClient_Sync – для работы в синхронном режиме
  • WebSocketClient_Async – для работы в асинхронном режиме

Общие требования

  1. Компонента выполнена по технологии Native API, предназначена для 1С от версии 8.2.9.356 и выше (8.2 и 8.3 любых версий) для ОС Windows x32 и x64.
  2. Для использования защищенного соединения используется библиотека OpenSSL, которая не входит в состав компоненты, а подключается динамически. Это дает возможность использовать самые свежие протоколы шифрования, обновив установленную версию OpenSSL. Путь в библиотеке OpenSSL указывается в свойствах компоненты.

Особенности работы объекта WebSocketClient_Sync

  1. Объект работает в асинхронном режиме. То есть после вызова любого метода объект приостанавливает выполнение основного потока 1С до тех пор, пока не будет получен результат.
  2. Сообщения могут отправляться и приниматься в виде строки или в виде двоичных данных. Сообщение в виде строки кодируется в UTF8. Если требуется другая кодировка, нужно использовать объекты Поток и ДвоичныеДанные (см. раздел "Работа с двоичными данными" справочной информации 1С).

Особенности работы объекта WebSocketClient_Async

  1. Объект работает в асинхронном режиме. То есть после вызова любого метода объект сразу возвращает управление основному потоку 1С. Далее объект продолжает выполнение метода в отдельном фоновом потоке. Таким образом, объект не зависит от длительных операций основного потока (таких, как формирование отчетов и т.п.).
  2. Для сигнализации о возникшем событии используется ВнешнееСобытие. Объект генерирует следующие события: "Open", "Close", "Message", "Ping", "Error".
  3. В 1С может быть одновременно создано несколько объектов WebSocketClient_Async. Чтобы понять, какому объекту адресовано событие, используется идентификатор <ObjectID>, который передается первым параметром во ВнешнемСобытии.
  4. Сообщения могут отправляться и приниматься в виде строки или в виде двоичных данных. Сообщение в виде строки кодируется в UTF8. Если требуется другая кодировка, нужно использовать объекты Поток и ДвоичныеДанные (см. раздел "Работа с двоичными данными" справочной информации 1С).
  5. Принятые сообщения накапливаются в очередь. После того, как сообщение добавлено в очередь, возникает событие "Message". Извлечь сообщение из очереди можно с помощью методов ПолучитьСообщениеКакСтроку или ПолучитьСообщениеКакДвоичныеДанные. После вызова любого из этих методов сообщение автоматически удаляется из очереди.
  6. Объект автоматически отправляет пакет Pong в ответ на получение пакета Ping. Дополнительно объект генерирует событие "Ping", которое не обязательно обрабатывать.
 

Объект WebSocketClient_Sync

Свойства объекта

OpenSLL_FileName – (чтение/запись)
Тип: Строка
Описание:
Имя файла динамической библиотеки OpenSSL (см. ниже)

Методы объекта

Открыть (Open)
Синтаксис:
Открыть(<АдресСервера>)
Параметры:
<АдресСервера> (обязательный)
Тип: Строка
URL-адрес сервера в формате ws://host:port/ или wss://host:port/
Возвращаемое значение:
Тип: Булево
Описание:
Устанавливает соединение с сервером. При успешном соединении возвращает Истина. Если соединение установить не удалось, возвращает Ложь. Описание ошибки можно получить с помощью метода ПолучитьОшибку()

Закрыть (Close)
Синтаксис: Закрыть(<Код>, <Причина>)
Параметры:
<Код> (необязательный)
Тип: Число
Код закрытия WebSocket, по умолчанию: 1000
<Причина>(необязательный)
Тип: Строка
Причина закрытия WebSocket, по умолчанию: пустая строка
Возвращаемое значение:
Тип: Булево
Описание:
Разрывает соединение с сервером.

ОтправитьСтроку (SendString)
Синтаксис:
ОтправитьСтроку(<Данные>)
Параметры:
<Данные> (обязательный)
Тип: Строка
Данные для отправки
Возвращаемое значение:
Тип: Булево
Описание:
Отправляет данные в виде строки в кодировке UTF8.

ОтправитьДвоичныеДанные (SendBinaryData)
Синтаксис:
ОтправитьДвоичныеДанные(<Данные>)
Параметры:
<Данные> (обязательный)
Тип: ДвоичныеДанные
Данные для отправки
Возвращаемое значение:
Тип: Булево
Описание:
Отправляет двоичные данные.

ПолучитьСообщениеКакСтроку (GetMessageAsString)
Синтаксис:
ПолучитьСообщениеКакСтроку()
Возвращаемое значение:
Тип: Строка или Неопределено
Описание:
Получает сообщение с сервера в виде строки UTF8.

ПолучитьСообщениеКакДвоичныеДанные (GetMessageAsBinaryData)
Синтаксис:
ПолучитьСообщениеКакДвоичныеДанные()
Возвращаемое значение:
Тип: ДвоичныеДанные или Неопределено
Описание:
Получает сообщение с сервера в виде двоичных данных.

ПолучитьОшибку (GetLastError)
Синтаксис:
ПолучитьОшибку()
Возвращаемое значение:
Тип: Строка
Описание:
Возвращает описание возникшей ошибки.

Разрядность (Bits)
Синтаксис:
Разрядность()
Возвращаемое значение:
Тип: Число
Описание:
Возвращает разрядность (32 или 64) запущенного процесса платформы 1С. Может использоваться для определения нужной версии библиотеки OpenSSL.

ПолучитьВерсиюSLL (GetSSLVersion)
Синтаксис:
ПолучитьВерсиюSLL()
Возвращаемое значение:
Тип: Строка
Описание:
При использовании защищенного соединения возвращает фактическую версию протокола, согласованную клиентом и сервером. Пример: "TLSv1.2"

 

Объект WebSocketClient_Async

Свойства объекта

ObjectID – (чтение/запись)
Тип: Строка
Описание:
Идентификатор, позволяющий отличать один объект компоненты от другого. По умолчанию устанавливается строкой вида WebSocketClient_NNNNN, где NNNNN - случайное число

OpenSLL_FileName – (чтение/запись)
Тип: Строка
Описание:
Имя файла динамической библиотеки OpenSSL (см. ниже)

Методы объекта

Открыть (Open)
Синтаксис:
Открыть(<АдресСервера>)
Параметры:
<АдресСервера> (обязательный)
Тип: Строка
URL-адрес сервера в формате ws://host:port/ или wss://host:port/
Описание:
Устанавливает соединение с сервером. При успешном соединении вызывает событие "Open". Если соединение не удалось установить, вызывает событие "Error"

Закрыть (Close)
Синтаксис: Закрыть(<Код>, <Причина>)
Параметры:
<Код> (необязательный)
Тип: Число
Код закрытия WebSocket, по умолчанию: 1000
<Причина>(необязательный)
Тип: Строка
Причина закрытия WebSocket, по умолчанию: пустая строка
Описание:
Разрывает соединение с сервером.

ОтправитьСтроку (SendString)
Синтаксис:
ОтправитьСтроку(<Данные>)
Параметры:
<Данные> (обязательный)
Тип: Строка
Данные для отправки
Описание:
Отправляет данные в виде строки в кодировке UTF8.
Примечание: Не следует отправлять данные ранее, чем возникло событие "Open".

ОтправитьДвоичныеДанные (SendBinaryData)
Синтаксис:
ОтправитьДвоичныеДанные(<Данные>)
Параметры:
<Данные> (обязательный)
Тип: ДвоичныеДанные
Данные для отправки
Описание:
Отправляет двоичные данные.
Примечание: Не следует отправлять данные ранее, чем возникло событие "Open".

ПолучитьСообщениеКакСтроку (GetMessageAsString)
Синтаксис:
ПолучитьСообщениеКакСтроку()
Возвращаемое значение:
Тип: Строка или Неопределено
Описание:
Извлекает следующее сообщение в виде строки UTF8 из очереди принятых сообщений. Если сообщений в очереди нет, то возвращает Неопределено. Метод следует вызывать после получения события "Message".

ПолучитьСообщениеКакДвоичныеДанные (GetMessageAsBinaryData)
Синтаксис:
ПолучитьСообщениеКакДвоичныеДанные()
Возвращаемое значение:
Тип: ДвоичныеДанные или Неопределено
Описание:
Извлекает следующее сообщение в виде двоичных данных из очереди принятых сообщений. Если сообщений в очереди нет, то возвращает Неопределено. Метод следует вызывать после получения события "Message".

ПолучитьКоличествоСообщений (GetMessagesCount)
Синтаксис:
ПолучитьКоличествоСообщений()
Возвращаемое значение:
Тип: Число
Описание:
Возвращает количество принятых сообщений в очереди.

Разрядность (Bits)
Синтаксис:
Разрядность()
Возвращаемое значение:
Тип: Число
Описание:
Возвращает разрядность (32 или 64) запущенного процесса платформы 1С. Может использоваться для определения нужной версии библиотеки OpenSSL.

ПолучитьВерсиюSLL (GetSSLVersion)
Синтаксис:
ПолучитьВерсиюSLL()
Возвращаемое значение:
Тип: Строка
Описание:
При использовании защищенного соединения возвращает фактическую версию протокола, согласованную клиентом и сервером. Пример: "TLSv1.2"

Внешние события

Объект WebSocketClient_Async генерирует внешние события с параметрами:
   Источник: <ObjectID>
   Событие: Вид события: "Open", "Close", "Message", "Ping", "Error"
   Данные: Дополнительное описание события (например, описание ошибки для "Error")


Использование защищенного соединения

Для установки защищенного соединения по протоколу WSS используется криптографическая библиотека OpenSSL. Для операционной системы Windows библиотека OpenSSL состоит из двух файлов: libssl.dll и libcrypto.dll (имена файлов могут изменяться в зависимости от версии OpenSSL). По умолчанию, компонента ищет файл libssl.dll в каталоге bin платформы 1С, и если не находит, продолжает искать в системных папках Windows. Путь и имя файла библиотеки libssl можно указать в свойстве компоненты OpenSLL_FileName (библиотека libcrypto загружается автоматически при загрузке libssl). Свойство OpenSLL_FileName должно быть установлено до вызова метода Открыть().

Поддерживаемые протоколы будут определятся версией OpenSSL. Например, для версии OpenSSL_1.1.1 это протоколы SSLv3, TLSv1, TLSv1.1, TLSv1.2 и TLSv1.3. Фактическая версия протокола будет согласована с самой высокой версией, взаимно поддерживаемой клиентом и сервером.

Пример: Компонента.OpenSLL_FileName = "libssl-1_1.dll"

 

Простой пример

Перем Компонента;

Процедура ПриОткрытии()
	Если ПодключитьВнешнююКомпоненту("ОбщийМакет.WebSocketClient", "SD3", ТипВнешнейКомпоненты.Native) Тогда
		Компонента = Новый("AddIn.SD3.WebSocketClient_ASync");
		//Компонента.OpenSLL_FileName = "libssl-1_1.dll";
	КонецЕсли;

	Если Компонента=Неопределено Тогда
		Сообщить("Ошибка подключения компоненты!");
	КонецЕсли;
	
КонецПроцедуры

Процедура КнопкаОткрытьНажатие(Элемент)
	//Тестовые эхо-сервера в Интернете
	Компонента.Открыть("ws://demos.kaazing.com/echo");
	//Компонента.Открыть("wss://echo.websocket.org");
КонецПроцедуры

Процедура КнопкаОтправитьНажатие(Элемент)
	Компонента.ОтправитьСтроку(ПолеВвода1);
КонецПроцедуры

Процедура КнопкаЗакрытьНажатие(Элемент)
	Компонента.Закрыть();
КонецПроцедуры

Процедура ВнешнееСобытие(Источник, Событие, Данные)
	Если Лев(Источник,16)="WebSocketClient_" Тогда
		Сообщить("Внешнее событие   Источник="+Источник+"  Событие="+Событие+"  Данные="+Данные);

		Если Событие="Message" Тогда
			А = Компонента.ПолучитьСообщениеКакСтроку();
			Сообщить(А);
		КонецЕсли;

	КонецЕсли;
КонецПроцедуры

 

Гарантия возврата денег

ООО "Инфостарт" гарантирует Вам 100% возврат оплаты, если программа не соответствует заявленному функционалу из описания. Деньги можно вернуть в полном объеме, если вы заявите об этом в течение 14-ти дней со дня поступления денег на наш счет.

Программа настолько проверена в работе, что мы с полной уверенностью можем дать такую гарантию. Мы хотим, чтобы все наши покупатели оставались довольны покупкой.

Для возврата оплаты просто свяжитесь с нами.

13

Скачать файлы

Наименование Файл Версия Размер
Тестовый пример
.epf 6,72Kb
26.08.19
5
.epf 6,72Kb 5 Скачать бесплатно
04.09.2019
1.0.1.27 1 5000 руб.

Моментальная
доставка

26.08.2019
0 2500 руб.

Внешняя компонента WebSocketClient
Возможно ли подключить вашу компоненту на уровне клиентского приложения для получения уведомлений вне зависимости от наличия открытых окон?
3
1

Новый вопрос

E-mail*
Тема (вопрос)*

См. также

Специальные предложения