Всем привет. Хочу поделиться тем, как начать использовать новый объект WebSocketКлиентСоединения, описать некоторые тонкости, которые успел заметить.
Пробовать буду на внешней обработке. Она будет очень простая: три кнопки "Открыть соединение", "Отправить сообщение", "Закрыть соединение".
Также понадобится реквизит формы "КлючСоединения" с типом строка, который я заполняю при создании формы:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
КлючСоединения = "f5d8323e-482a-4c42-9109-96875f0599d0";
КонецПроцедуры
Ключ соединения может быть любой строкой, "Соединение1", "WSconnect" и т.д. Я сгенерировал GUID, мне показалось так удобнее. Ключ используется для последующей работы с WebSocket соединениями.
Все процедуры можно писать даже на клиенте.
Кнопка "Открыть соединение"
&НаКлиенте
Процедура ОткрытьCоединение(Команда)
Попытка
URL = "ws://192.168.0.19:8765";
WebSocketКлиентСоединения.ОткрытьСоединение(КлючСоединения, URL);
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
В справке не указано, каким образом должен выглядеть URL. Методом проб и ошибок выяснил, что он состоит из имени протокола "ws://" и адреса хоста. У меня в качестве сервера выступает питоновский скрипт, который открывает порт 8765 на удалённой машине с адресом 192.168.0.19
Кнопка "Отправить сообщение"
&НаКлиенте
Процедура ОтправитьCообщение(Команда)
Попытка
Соединение = WebSocketКлиентСоединения.ПолучитьСоединение(КлючСоединения);
Соединение.ОтправитьСообщение("Hello websocket!");
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Первое, что тут происходит, это поиск соединения в менеджере вебсокет соединений как раз по ключу, который добавлен в переменную КлючСоединения. Потом отправка сообщения в него.
Объект WebSocketКлиентСоединение не сериализуется, поэтому его нельзя передавать с клиента на сервер. Но 1С поступили разумно, создав менеджер вебсокет соединений, который самостоятельно управляет ими. То есть, нам не нужно заботиться о сохранении своего соединения в переменной. Более того, если закрыть обработку, из которой создавали соединение, и открыть заново, то можно сразу отправлять сообщения, потому что своё соединение всегда можно получить по ключу! Соединения не сбрасываются, пока не завершена сессия текущего пользователя. Из другой сессии того же пользователя, к сожалению, получить соединение по тому же ключу нельзя.
Кнопка "Закрыть соединение"
&НаКлиенте
Процедура ЗакрытьСоединение(Команда)
Попытка
Соединение = WebSocketКлиентСоединения.ПолучитьСоединение(КлючСоединения);
Соединение.Закрыть();
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Тут снова находим наше соединение по ключу и завершаем его.
Заключение
Всё оказалось довольно просто и удобно. Надеюсь, для кого-то статья станет отправной точкой для создания своих обработок для Websocket соединений.
Для интересующихся домашнее задание: изучить обработчики объекта и создать код для "ОбработчикПолученияСообщения" для обработки входящих запросов :)
Всем удачи, пока.