// Пример SLACK
Процедура SlackBot()
ПутьККомпоненте = "c:/websocket.dll";
ИДКанала = "C23535436TR";
ТокенСлак = "xora-3234234324....";
Заголовки = Новый Соответствие;
Заголовки.Вставить("Authorization", "Bearer " + ТокенСлак);
Запрос = Новый HTTPЗапрос("api/rtm.connect", Заголовки);
Соединение = Новый HTTPСоединение("slack.com",,,,,, Новый ЗащищенноеСоединениеOpenSSL);
Ответ = Соединение.Получить(Запрос);
Если НЕ Ответ.КодСостояния = 200 Тогда
ВызватьИсключение "Не верный ответ";
КонецЕсли;
Данные = ПолучитьЗначениеИзОтветаJSON(Ответ.ПолучитьТелоКакСтроку());
урл = Данные.Получить("url");
Если НЕ ЗначениеЗаполнено(урл) Тогда
ВызватьИсключение "Нет адреса подключения";
КонецЕсли;
Если НЕ ПодключитьВнешнююКомпоненту(ПутьККомпоненте, "WebSocket", ТипВнешнейКомпоненты.Native) Тогда
СисИнфо = Новый СистемнаяИнформация;
ОписаниеОшибки = НСтр("ru='Ошибка подключения компоненты ('") + СисИнфо.ТипПлатформы + "):
|" + ОписаниеОшибки();
ВызватьИсключение ОписаниеОшибки;
КонецЕсли;
Клиент = Новый("AddIn.WebSocket.Client");
ТекстСообщения = ПолучитьСтрокуJSON(Новый Структура("type, channel, text", "message", ИДКанала, "Listen for 1C Enterprise"));
Попытка
Клиент.Подключиться(урл);
Исключение
Описание = ОписаниеОшибки();
ТекстОшибки = Клиент.ОписаниеОшибки();
ТекстОписания = Описание + ": " + ТекстОшибки;
ВызватьИсключение ТекстОписания;
КонецПопытки;
Данные = "";
ГотовПринимать = Ложь;
Пока Клиент.Принять(0, Данные) Цикл
Значение = ПолучитьЗначениеИзОтветаJSON(Данные);
Текст = Значение.Получить("text");
Если Значение.Получить("type") = "hello" Тогда
Клиент.Отправить(ТекстСообщения);
ГотовПринимать = Истина;
КонецЕсли;
Если Текст = Неопределено ИЛИ НЕ Значение.Получить("reply_to") = Неопределено ИЛИ НЕ ГотовПринимать Тогда
Продолжить;
КонецЕсли;
Если НРег(Текст) = НРег("go away!") ИЛИ НРег(Текст) = НРег("11") Тогда
ТекстСообщения = ПолучитьСтрокуJSON(Новый Структура("type, channel, text", "message", ИДКанала, "ok. bye-bye )))"));
Клиент.Отправить(ТекстСообщения);
Сообщить("Меня отключили");
Прервать;
КонецЕсли;
Сообщить(Текст);
ТекстСообщения = ПолучитьСтрокуJSON(Новый Структура("type, channel, text", "message", ИДКанала, "Получил: "+ Текст));
Клиент.Отправить(ТекстСообщения);
КонецЦикла;
Клиент.Отключиться();
//Клиент = Неопределено;
КонецПроцедуры
Функция ПолучитьЗначениеИзОтветаJSON(ТекстJSON) Экспорт
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ТекстJSON);
Значение = ПрочитатьJSON(ЧтениеJSON, Истина);
Возврат Значение;
КонецФункции
Функция ПолучитьСтрокуJSON(Значение) Экспорт
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, Значение);
Возврат ЗаписьJSON.Закрыть();
КонецФункции
А чего так мало описания? Я правильно понял что для того чтобы 1Ска приняла сообщение на своей стороне , она должна постоянно по расписанию опрашивать порт т.е. обращаться к компоненте чтобы она это сделала?
(1) решил не набивать статью примерами или кейсами, а дополнять по вопросам для оценки интересности данных технологий, а по интерфейсу взаимодействия ссылка вначале.
да, конечно, для того что бы принять соединение необходимо постоянно слушать порт. Как вариант, можно подвесить на регламентное задание которое будет постоянно висеть и перезапускаться в случае падения.
(2) (2) (1)
Вопрос. Можно ли принимать/отправлять фалы с сервера на клиент и наоборот. Если да то какого максимального размера ?
(4) можно двоичные данные кодировать в base64 и передавать как строку, максимальный размер не тестировался, думаю зависит от архитектуры и памями клиента и сервера
Добрый день.
А как сделать для клиента ожидание сообщения от сервера в фоновом режиме?
Я вижу, что во «ВнешнееСобытие» компонента не сообщает.
Да, внешних событий нет.
Варианта 2:
1. Блокировать исполнение кода до получения сообщения (или наступления таймаута)
2. Оставить объект компонента в памяти, не блокируя исполнение и периодически возвращаясь к проверке наличия сообщений, при долгих серверных обработках например, или обработчиком ожидания/действием пользователя на клиенте
Если не секрет, какую задачу хотите решить ?
(7)
>> Если не секрет, какую задачу хотите решить ?
Интеграция с WEB-CRM через REST.
Хочется подвесить соединение и ждать сообщений от CRM.
Я запихнул в обработку ожидания, но не вариант, т.к. «Получить()» получает за раз одно сообщение, а сообщений много, и очередь накапливается.
Было бы хорошо, чтоб компонента во ВнешнееСобытие передавала все поступающие сообщения.
Еще было бы хорошо, чтоб компонента имела фильтрацию сообщений по вхождению текста. Т.к. если от сервера их много, что часто бывает, то 1с может ощутимо тормозить на их фильтрации.
(8)
вот так тормозит?
Пока Получить(Сообщение, таймаут) Цикл
получите все доступные сообщения, компонент хранит в себе пришедшие сообщения, если их не получать они будут накапливаться в памяти.
(9)
Я про цикл как-то не подумал.
Спасибо.
(10) посмотрите примеры в документации, может еще что найдете
добрый день
а какой заголовок отправляется на сервер при подключении?
меня интересует значение 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
Как подключиться к ws-серверу, если клиент закрыт прокси?
Какие настройки inetcfg указать?
(14) прокси а данном компоненте не поддерживается
Подскажите, а для Linux бинарников нету?
(16) нет, требуется доработка кода, пока не занимался
Добрый день, мы работаем на платформе 1С:Предприятие 8.1 (8.1.15.14), сможем ли мы подключить эти DLL?
Про «поднимать веб-гнезда на сервере сложно» согласен. Через костыли.
Что бы экземпляр компоненты жил в потоке на сервере этот самый поток надо создать.
Как вариант, написать фоновое задание, которое будет создавать поток.
Этот поток передать во внешнюю компоненту вызовом метода и удерживать его там, передавая управление 1С только при получении сообщения.
Пока Истина Цикл
Сообщение = ВнешняяКомпонента.ПолучитьСообщение() // Здесь поток замирает до получения сообщения
ОбработкаСообщения(Сообщение);
КонецЦикла
Здравствуйте, скачал компоненту, и сразу встал вопрос, ваша компонента умеет передавать заголовки при подключении или нет? Мне нужно реализовать аналог такой функции
websocket.DefaultDialer.Dial(*addr, http.Header{«Authorization»: {«Bearer » + *token}})
По факту это аналог вашей, но с передачей заголовков.
Пример с сайта со slack также не подходит, так как в нем вначале вызывается http метод авторизации, а затем уже полученный url передается для соединения без заголовков.
Добрый, заголовки вроде не делал, slack и так работал, может что-то поменялось
(21) получается, если разработчики api дополнительно не предусмотрели, что перед работой через websocket необходимо дополнительно авторизоваться через http, то здесь ваша компонента не поможет? Но это же частный случай.
Частый да, но такой потребности не было, заголовок это всего лишь первые строки в tcp пакете, сообщение всеравно целиком приходит, по суди заголовок от сырых данных передаваемых первым сообщением мало чем отличается, поэтому слак раньше первым сообщением просил авторизацию и разрывал соединение, если не нравилось, как сейчас — не знаю. Да и уже существенно поменялся интерфейс используемой библиотеки c++, За полчаса заголовки у меня добавить не получится
(23) смотрите в описании написано
У меня есть wss ссылка и токен для нее, я могу использовать вашу компоненту для работы или нет?
Токен это прикладной объект конкретного сервера, по wss подключение поддерживается
(25) wss подключение, это подключение с авторизацией, с таким же успехом могло потребоваться передавать логин и пароль, либо id сессии, и в том и другом случае ваша компонента предполагает, что должна быть предварительная http авторизация, при этом должна быть сформирован специальный url, который и будет означать, что вы авторизовались.
Вы когда к сайту подключаетесь по обычному http часто с таким сталкиваетесь? Все обычно передается в заголовках.
(25) будет ли выпущена новая версия с учетом текущих замечаний?
С сервисом Мои звонки будет работать?
Скачал компоненты и для 32 и для 64. Все в целом удобно, пока не столкнулся с тем что нужно заполнение заголовка «origin». Было бы замечательно конечно если бы параметром можно было его устанавливать. Обновите пожалуйста, без этого не получится ее использовать.
Заметил ошибку
ВебСокетКлиент.Подключиться(АдресСервера);
ВебСокетКлиент.Отключиться();
ВебСокетКлиент.Подключиться(АдресСервера);
Зависает до перезагрузки 1С.