Перейти к основному содержимому

TCP

Модуль 1С/OSOPI_TCPКоманда CLItcp#Использоватьoint/api/tcp

Этот раздел посвящен библиотеке для работы с TCP соединениями в 1С:Предприятие, OneScript и CLI. На данной странице описаны все действия, необходимые для полноценного начала работы

Для реализации некоторых функции в этой библиотеке используется внешняя компонента
Пожалуйста, ознакомьтесь с разделом "О внешних компонентах" перед началом работы
Для работы этой библиотеки на Linux необходим OpenSSL 3.x
Узнать больше: "Об использовании OpenSSL во внешних компонентах"

Начало работы

Библиотека предоставляет возможность работы с TCP протоколом в двух режимах: как клиент (подключение к удаленному серверу) и как сервер (прием входящих соединений). Библиотека поддерживает работу с двоичными данными и текстом, использование TLS шифрования и прокси-серверов.

Работа в режиме клиента

Данная библиотека предоставляет несколько готовых методов для работы в качестве TCP клиента. Стандартная схема взаимодействия выглядит следующим образом:

  1. Создание объекта и подключение к серверу производится при помощи функции ОткрытьСоединение. Туда передается строка подключения в формате <адрес>:<порт>
  2. При необходимости, серверу можно отправить сообщение при помощи функций ОтправитьДвоичныеДанные и ОтправитСтроку
  3. Для получения данных от сервера, используются функции ПрочитатьДвоичныеДанные и ПрочитатьСтроку. Они имеют различные параметры для ограничения получаемых данных по размеру, маркеру и ожиданию ввода (таймауту)
  4. При окончании работы желательно явно завершать соединение при помощи функции ЗакрытьСоединение

Для простого сценария со стандартными настройками, также существует функция ОбработатьЗапрос - она отправляет данные на указанный адрес и ждет ответа, завершая чтение при нахождении стандартного маркера \\n. Также это единственная функция, которая доступна в CLI версии ОПИ

TLS

Библиотека поддерживает работу в режиме TLS. Для его включения необходимо сформировать настройки TLS при помощи функции ПолучитьНастройкиTls, и передать их как соответствующий параметр в функцию ОткрытьСоединение или ОбработатьЗапрос. Если параметр TLS при вызове этих функций не передан, соединение инициализируется в незащищенном режиме

Использование прокси

Данный клиент поддерживает создание соединения через прокси сервер. Получить структуру настроек прокси можно при помощи функции ПолучитьНастройкиПрокси. Полученная структура, далее, должна быть передана в функцию ОткрытьСоединение или ОбработатьЗапрос при начале работы

    ...

ТипПрокси = "http"; // http, socks5, socks4

АдресПрокси = "127.0.0.1";
ПортПрокси = "8071";
ЛогинПрокси = "proxyuser";
ПарольПрокси = "12we...";

НастройкиПрокси = OPI_TCP.ПолучитьНастройкиПрокси(АдресПрокси, ПортПрокси, ТипПрокси, ЛогинПрокси, ПарольПрокси);

Соединение = OPI_TCP.ОткрытьСоединение(Адрес, НастройкиTLS, НастройкиПрокси);

Поддерживается работа через SOCKS4, SOCKS5 и HTTP-прокси серверы

warning

Работа через http-прокси является экспериментальной и может быть нестабильной в зависимости от реализации прокси-сервера, его настроек и возможностей. Рекомендуется по возможности использовать SOCKS-прокси для стабильной передачи трафика

Работа в режиме сервера

Для начало использования функций TCP сервера необходимо:

  1. При необходимости получить структуру настроек логирования при помощи функции ПолучитьНастройкиЛогирования
  2. Запустить сервер при помощи функции ЗапуститьСервер
  3. Получать входящие данные при помощи функций ПолучитьДанныеОчередногоСоединения или ПолучитьДанныеСоединения
  4. Отправлять ответы при помощи функции ОтправитьДанные
  5. Остановить сервер при помощи функции ОстановитьСервер

Пример реализации простого эхо-сервера:


Процедура ЗапуститьЭхоСервер() Экспорт

Порт = 9876;
РазмерПула = 10;

НастройкиЛога = OPI_TCP.ПолучитьНастройкиЛогирования(Истина, 500, "D:\SERVER_LOG.txt");
ОбъектСервера = OPI_TCP.ЗапуститьСервер(Порт, РазмерПула, НастройкиЛога);

Если Не OPI_TCP.ЭтоОбъектСервера(ОбъектСервера) Тогда
ВызватьИсключение ОбъектСервера["error"];
КонецЕсли;

Попытка

ШаблонОтвета = "Receive ""%1"". Your IP: %2";

Пока Константы.ПоддерживатьСервер.Получить() Цикл

Результат = OPI_TCP.ПолучитьДанныеОчередногоСоединения(ОбъектСервера, 10000, 8192);

Если Не Результат["result"] Тогда

ТекстОшибки = Результат["error"];

Если ТекстОшибки = "timeout" Тогда
Продолжить;
Иначе
ВызватьИсключение ТекстОшибки;
КонецЕсли;

КонецЕсли;

IDСоединения = Результат["connectionId"];
Адрес = Результат["address"];
Сообщение = ПолучитьСтрокуИзДвоичныхДанных(Результат["message"]);

Ответ = СтрШаблон(ШаблонОтвета, Сообщение, Адрес);

OPI_TCP.ОтправитьДанные(ОбъектСервера, IDСоединения, Ответ);

КонецЦикла;

Исключение
OPI_TCP.ОстановитьСервер(ОбъектСервера);
ВызватьИсключение ОписаниеОшибки();
КонецПопытки;

OPI_TCP.ОстановитьСервер(ОбъектСервера);

КонецПроцедуры