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 не будет опубликован. Обязательные поля помечены *