WebSocket Клиент / Сервер. Внешний компонент

Реализация протокола WebSocket. Клиентская часть для взаимодействия с внешними сервисами. Серверная часть для организации собственного сервера, принимающего клиентские соединения в многопоточном режиме.
Возможно взаимодействие RabbitMQ Slack Asterisk и другие

Актуальная документация здесь 1c-websocket.readthedocs.io

WebSocket — протокол связи поверх TCP-соединения, предназначенный для обмена сообщениями между приложениями в режиме реального времени.

Основной смысл протокола — держать постоянное соединение между сервером и клиентом для обмена данными.

Данная разработка содержит в себе как Клиент так и Сервер websocket.

Для реализации сервера можно использовать такой алгоритм:

Регламентное задание с расписанием повторять каждую 1 секунду запускается на сервере, прослушивает порт и принимает соединения.

Если обработка входящих сообщений занимает продолжительное время — запускаем фоновое задание обработки и с ИД клиента. Затем возвращаем результат клиенту, если это требуется.

Позволяет подключаться и принимать подключения в роли сервера как в режиме без шифровки (ws://), так и используя протокол шифрования (wss://) (сертификат .pem (для примера в приложении))

 

 RabbitMQ

 

Пример SLACK

Собрать в архив файлы компонента поможет обработка

По теме:

Тестировалось на платформе 8.3.11.

30 Comments

  1. informa1555

    А чего так мало описания? Я правильно понял что для того чтобы 1Ска приняла сообщение на своей стороне , она должна постоянно по расписанию опрашивать порт т.е. обращаться к компоненте чтобы она это сделала?

    Reply
  2. nomadon

    (1) решил не набивать статью примерами или кейсами, а дополнять по вопросам для оценки интересности данных технологий, а по интерфейсу взаимодействия ссылка вначале.

    да, конечно, для того что бы принять соединение необходимо постоянно слушать порт. Как вариант, можно подвесить на регламентное задание которое будет постоянно висеть и перезапускаться в случае падения.

    Reply
  3. dyas

    (2) (2) (1)

    Reply
  4. dyas

    Вопрос. Можно ли принимать/отправлять фалы с сервера на клиент и наоборот. Если да то какого максимального размера ?

    Reply
  5. nomadon

    (4) можно двоичные данные кодировать в base64 и передавать как строку, максимальный размер не тестировался, думаю зависит от архитектуры и памями клиента и сервера

    Reply
  6. Masich

    Добрый день.

    А как сделать для клиента ожидание сообщения от сервера в фоновом режиме?

    Я вижу, что во «ВнешнееСобытие» компонента не сообщает.

    Reply
  7. nomadon

    Да, внешних событий нет.

    Варианта 2:

    1. Блокировать исполнение кода до получения сообщения (или наступления таймаута)

    2. Оставить объект компонента в памяти, не блокируя исполнение и периодически возвращаясь к проверке наличия сообщений, при долгих серверных обработках например, или обработчиком ожидания/действием пользователя на клиенте

    Если не секрет, какую задачу хотите решить ?

    Reply
  8. Masich

    (7)

    >> Если не секрет, какую задачу хотите решить ?

    Интеграция с WEB-CRM через REST.

    Хочется подвесить соединение и ждать сообщений от CRM.

    Я запихнул в обработку ожидания, но не вариант, т.к. «Получить()» получает за раз одно сообщение, а сообщений много, и очередь накапливается.

    Было бы хорошо, чтоб компонента во ВнешнееСобытие передавала все поступающие сообщения.

    Еще было бы хорошо, чтоб компонента имела фильтрацию сообщений по вхождению текста. Т.к. если от сервера их много, что часто бывает, то 1с может ощутимо тормозить на их фильтрации.

    Reply
  9. nomadon

    (8)

    вот так тормозит?

    Пока Получить(Сообщение, таймаут) Цикл

    получите все доступные сообщения, компонент хранит в себе пришедшие сообщения, если их не получать они будут накапливаться в памяти.

    Reply
  10. Masich

    (9)

    Я про цикл как-то не подумал.

    Спасибо.

    Reply
  11. nomadon

    (10) посмотрите примеры в документации, может еще что найдете

    Reply
  12. 1739712

    добрый день

    а какой заголовок отправляется на сервер при подключении?

    Reply
  13. 1739712

    меня интересует значение origin

    GET /chat HTTP/1.1

    Host: server.example.com

    Upgrade: websocket

    Connection: Upgrade

    Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==

    Origin: example.com

    Sec-WebSocket-Protocol: chat, superchat

    Sec-WebSocket-Version: 13

    Reply
  14. popovm

    Как подключиться к ws-серверу, если клиент закрыт прокси?

    Какие настройки inetcfg указать?

    Reply
  15. nomadon

    (14) прокси а данном компоненте не поддерживается

    Reply
  16. user598551_vaa

    Подскажите, а для Linux бинарников нету?

    Reply
  17. nomadon

    (16) нет, требуется доработка кода, пока не занимался

    Reply
  18. lagerfield

    Добрый день, мы работаем на платформе 1С:Предприятие 8.1 (8.1.15.14), сможем ли мы подключить эти DLL?

    Reply
  19. Steelvan

    Про «поднимать веб-гнезда на сервере сложно» согласен. Через костыли.

    Что бы экземпляр компоненты жил в потоке на сервере этот самый поток надо создать.

    Как вариант, написать фоновое задание, которое будет создавать поток.

    Этот поток передать во внешнюю компоненту вызовом метода и удерживать его там, передавая управление 1С только при получении сообщения.

    Пока Истина Цикл

    Сообщение = ВнешняяКомпонента.ПолучитьСообщение() // Здесь поток замирает до получения сообщения

    ОбработкаСообщения(Сообщение);

    КонецЦикла

    Reply
  20. karpik666

    Здравствуйте, скачал компоненту, и сразу встал вопрос, ваша компонента умеет передавать заголовки при подключении или нет? Мне нужно реализовать аналог такой функции

    websocket.DefaultDialer.Dial(*addr, http.Header{«Authorization»: {«Bearer » + *token}})

    По факту это аналог вашей, но с передачей заголовков.

    Пример с сайта со slack также не подходит, так как в нем вначале вызывается http метод авторизации, а затем уже полученный url передается для соединения без заголовков.

    Reply
  21. nomadon

    Добрый, заголовки вроде не делал, slack и так работал, может что-то поменялось

    Reply
  22. karpik666

    (21) получается, если разработчики api дополнительно не предусмотрели, что перед работой через websocket необходимо дополнительно авторизоваться через http, то здесь ваша компонента не поможет? Но это же частный случай.

    Reply
  23. nomadon

    Частый да, но такой потребности не было, заголовок это всего лишь первые строки в tcp пакете, сообщение всеравно целиком приходит, по суди заголовок от сырых данных передаваемых первым сообщением мало чем отличается, поэтому слак раньше первым сообщением просил авторизацию и разрывал соединение, если не нравилось, как сейчас — не знаю. Да и уже существенно поменялся интерфейс используемой библиотеки c++, За полчаса заголовки у меня добавить не получится

    Reply
  24. karpik666

    (23) смотрите в описании написано

    Позволяет подключаться и принимать подключения в роли сервера как в режиме без шифровки (ws://), так и используя протокол шифрования (wss://)

    У меня есть wss ссылка и токен для нее, я могу использовать вашу компоненту для работы или нет?

    Reply
  25. nomadon

    Токен это прикладной объект конкретного сервера, по wss подключение поддерживается

    Reply
  26. karpik666

    (25) wss подключение, это подключение с авторизацией, с таким же успехом могло потребоваться передавать логин и пароль, либо id сессии, и в том и другом случае ваша компонента предполагает, что должна быть предварительная http авторизация, при этом должна быть сформирован специальный url, который и будет означать, что вы авторизовались.

    Вы когда к сайту подключаетесь по обычному http часто с таким сталкиваетесь? Все обычно передается в заголовках.

    Reply
  27. karpik666

    (25) будет ли выпущена новая версия с учетом текущих замечаний?

    Reply
  28. lazovit

    С сервисом Мои звонки будет работать?

    Reply
  29. lectorkoba

    Скачал компоненты и для 32 и для 64. Все в целом удобно, пока не столкнулся с тем что нужно заполнение заголовка «origin». Было бы замечательно конечно если бы параметром можно было его устанавливать. Обновите пожалуйста, без этого не получится ее использовать.

    Reply
  30. lectorkoba

    Заметил ошибку

    ВебСокетКлиент.Подключиться(АдресСервера);

    ВебСокетКлиент.Отключиться();

    ВебСокетКлиент.Подключиться(АдресСервера);

    Зависает до перезагрузки 1С.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *