mirror of
https://github.com/Bayselonarrend/OpenIntegrations.git
synced 2024-12-27 02:43:54 +02:00
Доработки по TCP
This commit is contained in:
parent
40844f6a4d
commit
06ae318609
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@ -1,69 +1,36 @@
|
||||
use std::io::{Read, Write};
|
||||
use std::net::TcpStream;
|
||||
use native_tls::TlsStream;
|
||||
use std::time::{Duration, Instant};
|
||||
|
||||
pub enum Connection {
|
||||
Tcp(TcpStream),
|
||||
Tls(TlsStream<TcpStream>),
|
||||
}
|
||||
|
||||
impl Connection {
|
||||
pub fn write(&mut self, data: &[u8]) -> std::io::Result<usize> {
|
||||
match self {
|
||||
Connection::Tcp(stream) => stream.write(data),
|
||||
Connection::Tls(stream) => stream.write(data),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn read(&mut self, buffer: &mut [u8]) -> std::io::Result<usize> {
|
||||
match self {
|
||||
Connection::Tcp(stream) => stream.read(buffer),
|
||||
Connection::Tls(stream) => stream.read(buffer),
|
||||
}
|
||||
}
|
||||
}
|
||||
use std::time::{Duration};
|
||||
|
||||
/// Отправляет данные
|
||||
pub fn send(connection: &mut Connection, data: Vec<u8>, timeout_ms: i32) -> bool {
|
||||
pub fn send(connection: &mut TcpStream, data: Vec<u8>, timeout_ms: i32) -> bool {
|
||||
|
||||
match connection {
|
||||
Connection::Tcp(stream) => {
|
||||
stream.set_write_timeout(Some(Duration::from_millis(timeout_ms as u64))).ok();
|
||||
}
|
||||
Connection::Tls(stream) => {
|
||||
stream.get_ref().set_write_timeout(Some(Duration::from_millis(timeout_ms as u64))).ok();
|
||||
}
|
||||
if timeout_ms > 0 {
|
||||
let timeout = Duration::from_millis(timeout_ms as u64);
|
||||
connection.set_write_timeout(Some(timeout)).ok();
|
||||
}
|
||||
|
||||
match connection.write(&data) {
|
||||
Ok(_) => true,
|
||||
Ok(_) => connection.flush().is_ok(),
|
||||
Err(_) => false, // Ошибка при отправке данных
|
||||
}
|
||||
}
|
||||
|
||||
/// Считывает данные
|
||||
pub fn receive(
|
||||
connection: &mut Connection,
|
||||
timeout_ms: i32,
|
||||
max_attempts: i32,
|
||||
connection: &mut TcpStream,
|
||||
max_data_size: i32,
|
||||
timeout_ms: i32,
|
||||
) -> Vec<u8> {
|
||||
const BUFFER_SIZE: usize = 4096; // Фиксированный размер буфера
|
||||
const BUFFER_SIZE: usize = 1024; // Фиксированный размер буфера
|
||||
|
||||
let mut result = Vec::new();
|
||||
let mut buffer = vec![0u8; BUFFER_SIZE];
|
||||
let mut attempts = 0;
|
||||
|
||||
// Устанавливаем таймаут для чтения
|
||||
let timeout = Duration::from_millis(timeout_ms as u64);
|
||||
match connection {
|
||||
Connection::Tcp(stream) => {
|
||||
stream.set_read_timeout(Some(timeout)).ok();
|
||||
}
|
||||
Connection::Tls(stream) => {
|
||||
stream.get_ref().set_read_timeout(Some(timeout)).ok();
|
||||
}
|
||||
if timeout_ms > 0 {
|
||||
let timeout = Duration::from_millis(timeout_ms as u64);
|
||||
connection.set_read_timeout(Some(timeout)).ok();
|
||||
}
|
||||
|
||||
loop {
|
||||
@ -74,18 +41,9 @@ pub fn receive(
|
||||
|
||||
match connection.read(&mut buffer) {
|
||||
Ok(0) => break, // Конец данных (EOF)
|
||||
Ok(size) => {
|
||||
result.extend_from_slice(&buffer[..size]);
|
||||
attempts = 0; // Сбрасываем счетчик попыток при успешном чтении
|
||||
}
|
||||
Err(ref e) if e.kind() == std::io::ErrorKind::WouldBlock => {
|
||||
attempts += 1;
|
||||
if attempts >= max_attempts {
|
||||
break; // Превышено число попыток ожидания
|
||||
}
|
||||
continue; // Пробуем снова
|
||||
}
|
||||
Err(_) => break // Любая другая ошибка
|
||||
Ok(size) => result.extend_from_slice(&buffer[..size]),
|
||||
Err(ref e) if e.kind() == std::io::ErrorKind::WouldBlock => break,
|
||||
Err(_) => break
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2,9 +2,7 @@ mod methods;
|
||||
|
||||
use addin1c::{name, Variant};
|
||||
use crate::core::getset;
|
||||
use methods::Connection;
|
||||
use std::net::TcpStream;
|
||||
use native_tls::{TlsConnector};
|
||||
use crate::component::methods::disconnect;
|
||||
|
||||
// МЕТОДЫ КОМПОНЕНТЫ -------------------------------------------------------------------------------
|
||||
@ -14,7 +12,7 @@ pub const METHODS: &[&[u16]] = &[
|
||||
name!("Connect"), // 0
|
||||
name!("Disconnect"), // 1
|
||||
name!("Read"), // 2
|
||||
name!("Write"), // 3
|
||||
name!("Send"), // 3
|
||||
];
|
||||
|
||||
// Число параметров функций компоненты
|
||||
@ -22,7 +20,7 @@ pub fn get_params_amount(num: usize) -> usize {
|
||||
match num {
|
||||
0 => 0,
|
||||
1 => 0,
|
||||
2 => 3,
|
||||
2 => 2,
|
||||
3 => 2,
|
||||
_ => 0,
|
||||
}
|
||||
@ -43,11 +41,10 @@ pub fn cal_func(obj: &mut AddIn, num: usize, params: &mut [Variant]) -> Box<dyn
|
||||
|
||||
|
||||
let timeout = params[0].get_i32().unwrap_or(0);
|
||||
let max_attempts= params[1].get_i32().unwrap_or(0);
|
||||
let maxsize = params[2].get_i32().unwrap_or(0);
|
||||
|
||||
if let Some(ref mut connection) = obj.connection {
|
||||
Box::new(methods::receive(connection, timeout, max_attempts, maxsize))
|
||||
Box::new(methods::receive(connection, maxsize, timeout))
|
||||
} else {
|
||||
Box::new(Vec::<u8>::new()) // Если соединения нет, возвращаем пустой массив
|
||||
}
|
||||
@ -56,7 +53,7 @@ pub fn cal_func(obj: &mut AddIn, num: usize, params: &mut [Variant]) -> Box<dyn
|
||||
|
||||
let empty_array: [u8; 0] = [];
|
||||
|
||||
let data = params[0].get_blob().unwrap_or(&empty_array);
|
||||
let data = params[0].get_blob().unwrap_or(&empty_array);
|
||||
let timeout = params[1].get_i32().unwrap_or(0);
|
||||
|
||||
if let Some(ref mut connection) = obj.connection {
|
||||
@ -76,15 +73,13 @@ pub fn cal_func(obj: &mut AddIn, num: usize, params: &mut [Variant]) -> Box<dyn
|
||||
|
||||
// Синонимы
|
||||
pub const PROPS: &[&[u16]] = &[
|
||||
name!("Address"),
|
||||
name!("SSL"),
|
||||
name!("Address")
|
||||
];
|
||||
|
||||
|
||||
pub struct AddIn {
|
||||
pub address: String,
|
||||
pub use_ssl: bool,
|
||||
connection: Option<Connection>,
|
||||
connection: Option<TcpStream>,
|
||||
}
|
||||
|
||||
impl AddIn {
|
||||
@ -92,48 +87,29 @@ impl AddIn {
|
||||
pub fn new() -> Self {
|
||||
AddIn {
|
||||
address: String::new(),
|
||||
use_ssl: false,
|
||||
connection: None,
|
||||
}
|
||||
}
|
||||
|
||||
/// Подключается к серверу
|
||||
pub fn connect(&mut self) -> bool {
|
||||
|
||||
if self.address.is_empty() {
|
||||
return false; // Ошибка: пустой адрес
|
||||
}
|
||||
|
||||
if self.use_ssl {
|
||||
let connector = match TlsConnector::new() {
|
||||
Ok(conn) => conn,
|
||||
Err(_) => return false, // Ошибка при создании TLS-коннектора
|
||||
};
|
||||
let stream = match TcpStream::connect(&self.address) {
|
||||
Ok(s) => s,
|
||||
Err(_) => return false, // Ошибка при подключении
|
||||
};
|
||||
match connector.connect(&self.address, stream) {
|
||||
Ok(tls_stream) => {
|
||||
self.connection = Some(Connection::Tls(tls_stream));
|
||||
true
|
||||
}
|
||||
Err(_) => false, // Ошибка при установлении TLS
|
||||
}
|
||||
} else {
|
||||
match TcpStream::connect(&self.address) {
|
||||
Ok(tcp_stream) => {
|
||||
self.connection = Some(Connection::Tcp(tcp_stream));
|
||||
true
|
||||
}
|
||||
Err(_) => false, // Ошибка при подключении
|
||||
match TcpStream::connect(&self.address) {
|
||||
Ok(tcp_stream) => {
|
||||
self.connection = Some(tcp_stream);
|
||||
true
|
||||
}
|
||||
Err(_) => false, // Ошибка при подключении
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_field_ptr(&self, index: usize) -> *const dyn getset::ValueType {
|
||||
match index {
|
||||
0 => &self.address as &dyn getset::ValueType as *const _,
|
||||
1 => &self.use_ssl as &dyn getset::ValueType as *const _,
|
||||
_ => panic!("Index out of bounds"),
|
||||
}
|
||||
}
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -47,23 +47,20 @@
|
||||
|
||||
// !NOCLI
|
||||
// Открыть соединение
|
||||
// Создает TCP/TLS соединение
|
||||
// Создает TCP соединение
|
||||
//
|
||||
// Параметры:
|
||||
// Адрес - Строка - Адрес и порт для подключения - address
|
||||
// SSL - Булево - Признак использования защищенного соединения - ssl
|
||||
// Адрес - Строка - Адрес и порт для подключения - address
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Неопределено, Произвольный - Возвращает объект TCP клиента при успешном подключении или неопределено
|
||||
Функция ОткрытьСоединение(Знач Адрес, Знач SSL = Ложь) Экспорт
|
||||
Функция ОткрытьСоединение(Знач Адрес) Экспорт
|
||||
|
||||
OPI_ПреобразованиеТипов.ПолучитьСтроку(Адрес);
|
||||
OPI_ПреобразованиеТипов.ПолучитьБулево(SSL);
|
||||
|
||||
TCPКлиент = OPI_Инструменты.ПолучитьКомпоненту("TCPClient");
|
||||
|
||||
TCPКлиент.Address = Адрес;
|
||||
TCPКлиент.SSL = SSL;
|
||||
|
||||
Успех = TCPКлиент.Connect();
|
||||
|
||||
@ -85,79 +82,141 @@
|
||||
КонецФункции
|
||||
|
||||
// !NOCLI
|
||||
// Получить данные
|
||||
// Прочитать двоичные данные
|
||||
// Читает данные из указанного соединения
|
||||
//
|
||||
// Примечание:
|
||||
// Метод пытается прочесть данные интервалами, длительность которых указана в параметре ДлительностьПопытки.^^
|
||||
// За максимальное число попыток отвечает параметр ЧислоПопыток. При успешном получении новых данных число попыток сбрасывается.
|
||||
// При работе с бесконечным потоком входящих данных обязательно указание параметра МаксимальныйРазмер, так как^^
|
||||
// бесконечный сброс попыток при получении данных может привести к зависанию
|
||||
// бесконечное получение данных может привести к зависанию
|
||||
// При закрытии соединения, ошибке или обнаружении EOF чтение завершается в любом случае
|
||||
//
|
||||
// Параметры:
|
||||
// Соединение - Произвольный - Соединение, см. ОткрытьСоединение - tcp
|
||||
// ДлительностьПопытки - Число - Интервал между попытками получения данных - timeout
|
||||
// ЧислоПопыток - Число - Максимальное число попыток получения данных - attempts
|
||||
// МаксимальныйРазмер - Число - Максимальный размер данных. 0 > без ограничений - size
|
||||
// Соединение - Произвольный - Соединение, см. ОткрытьСоединение - tcp
|
||||
// МаксимальныйРазмер - Число - Максимальный размер данных (байт). 0 > без ограничений - size
|
||||
// Таймаут - Число - Таймаут ожидания данных (мс). 0 > без ограничений - timeout
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// ДвоичныеДанные - Полученные данные
|
||||
Функция ПолучитьДанные(Знач Соединение
|
||||
, Знач ДлительностьПопытки = 200
|
||||
, Знач ЧислоПопыток = 5
|
||||
, Знач МаксимальныйРазмер = 0) Экспорт
|
||||
Функция ПрочитатьДвоичныеДанные(Знач Соединение, Знач МаксимальныйРазмер = 0, Знач Таймаут = 5000) Экспорт
|
||||
|
||||
OPI_ПреобразованиеТипов.ПолучитьЧисло(ДлительностьПопытки);
|
||||
OPI_ПреобразованиеТипов.ПолучитьЧисло(ЧислоПопыток);
|
||||
OPI_ПреобразованиеТипов.ПолучитьЧисло(Таймаут);
|
||||
OPI_ПреобразованиеТипов.ПолучитьЧисло(МаксимальныйРазмер);
|
||||
|
||||
Возврат Соединение.Read(ДлительностьПопытки, ЧислоПопыток, МаксимальныйРазмер);
|
||||
Данные = Соединение.Read(МаксимальныйРазмер, Таймаут);
|
||||
|
||||
Возврат Данные;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// !NOCLI
|
||||
// Прочитать строку
|
||||
// Читает данные из указанного соединения в виде строки
|
||||
//
|
||||
// Примечание:
|
||||
// При закрытии соединения, ошибке или обнаружении EOF чтение завершается в любом случае
|
||||
//
|
||||
// Параметры:
|
||||
// Соединение - Произвольный - Соединение, см. ОткрытьСоединение - tcp
|
||||
// Кодировка - Строка - Кодировка преобразования данных в строку - enc
|
||||
// Таймаут - Число - Таймаут ожидания данных (мс). 0 > без ограничений - timeout
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Строка - Полученные данные в виде строки
|
||||
Функция ПрочитатьСтроку(Знач Соединение, Знач Кодировка = "UTF-8", Знач Таймаут = 5000) Экспорт
|
||||
|
||||
OPI_ПреобразованиеТипов.ПолучитьСтроку(Кодировка);
|
||||
|
||||
Данные = ПрочитатьДвоичныеДанные(Соединение, , Таймаут);
|
||||
Данные = ПолучитьСтрокуИзДвоичныхДанных(Данные, Кодировка);
|
||||
|
||||
Возврат Данные;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// !NOCLI
|
||||
// Отправить двоичные данные
|
||||
// Отправляет двоичные данные через указанное соединение
|
||||
//
|
||||
// Параметры:
|
||||
// Соединение - Произвольный - Соединение, см. ОткрытьСоединение - tcp
|
||||
// Данные - ДвоичныеДанные - Данные для отправки - data
|
||||
// Таймаут - Число - Таймаут ожидания записи (мс). 0 > без ограничений - timeout
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Булево - Признак успешного выполнения
|
||||
Функция ОтправитьДвоичныеДанные(Знач Соединение, Знач Данные, Знач Таймаут = 5000) Экспорт
|
||||
|
||||
OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Данные);
|
||||
OPI_ПреобразованиеТипов.ПолучитьЧисло(Таймаут);
|
||||
|
||||
Результат = Соединение.Send(Данные, Таймаут);
|
||||
|
||||
Возврат Результат;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// !NOCLI
|
||||
// Отправить строку
|
||||
// Отправляет данные в виде строки через указанное соединение
|
||||
//
|
||||
// Параметры:
|
||||
// Соединение - Произвольный - Соединение, см. ОткрытьСоединение - tcp
|
||||
// Данные - Строка - Данные для отправки в виде строки - data
|
||||
// Кодировка - Строка - Кодировка для записи исходящей строки в поток - enc
|
||||
// Таймаут - Число - Таймаут ожидания записи (мс). 0 > без ограничений - timeout
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Булево - Признак успешного выполнения
|
||||
Функция ОтправитьСтроку(Знач Соединение, Знач Данные, Знач Кодировка = "UTF-8", Знач Таймаут = 5000) Экспорт
|
||||
|
||||
OPI_ПреобразованиеТипов.ПолучитьСтроку(Данные);
|
||||
OPI_ПреобразованиеТипов.ПолучитьСтроку(Кодировка);
|
||||
|
||||
ДанныеДД = ПолучитьДвоичныеДанныеИзСтроки(Данные, Кодировка);
|
||||
|
||||
Результат = ОтправитьДвоичныеДанные(Соединение, ДанныеДД, Таймаут);
|
||||
|
||||
Возврат Результат;
|
||||
|
||||
КонецФункции
|
||||
|
||||
|
||||
// Подключиться и получить данные
|
||||
// Создает соединение и читает данные до конца или по ограничениям
|
||||
//
|
||||
// Примечание:
|
||||
// Метод пытается прочесть данные интервалами, длительность которых указана в параметре ДлительностьПопытки.^^
|
||||
// За максимальное число попыток отвечает параметр ЧислоПопыток. При успешном получении новых данных число попыток сбрасывается.
|
||||
// При работе с бесконечным потоком входящих данных обязательно указание параметра МаксимальныйРазмер, так как^^
|
||||
// бесконечный сброс попыток при получении данных может привести к зависанию
|
||||
// бесконечное получение данных может привести к зависанию
|
||||
// При закрытии соединения, ошибке или обнаружении EOF чтение завершается в любом случае
|
||||
//
|
||||
// Параметры:
|
||||
// Адрес - Строка - Адрес и порт для подключения - address
|
||||
// SSL - Булево - Признак использования защищенного соединения - ssl
|
||||
// ДлительностьПопытки - Число - Интервал между попытками получения данных - timeout
|
||||
// ЧислоПопыток - Число - Максимальное число попыток получения данных - attempts
|
||||
// МаксимальныйРазмер - Число - Максимальный размер данных. 0 > без ограничений - size
|
||||
// Строкой - Булево - Истина > возвращает строку, Ложь > двоичные данные - string
|
||||
// Кодировка - Строка - Кодировка получаемых данных - enc
|
||||
// Адрес - Строка - Адрес и порт для подключения - address
|
||||
// МаксимальныйРазмер - Число - Максимальный размер данных. 0 > без ограничений - size
|
||||
// Таймаут - Число - Таймаут ожидания данных - timeout
|
||||
// Строкой - Булево - Истина > возвращает строку, Ложь > двоичные данные - string
|
||||
// Кодировка - Строка - Кодировка получаемых данных - enc
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Строка, ДвоичныеДанные - Полученные данные
|
||||
Функция ПодключитьсяИПолучитьДанные(Знач Адрес
|
||||
, Знач SSL = Ложь
|
||||
, Знач ДлительностьПопытки = 0
|
||||
, Знач ЧислоПопыток = 5
|
||||
, Знач МаксимальныйРазмер = 0
|
||||
, Знач Таймаут = 5000
|
||||
, Знач Строкой = Истина
|
||||
, Знач Кодировка = "UTF-8") Экспорт
|
||||
|
||||
OPI_ПреобразованиеТипов.ПолучитьБулево(Строкой);
|
||||
OPI_ПреобразованиеТипов.ПолучитьСтроку(Кодировка);
|
||||
|
||||
Соединение = ОткрытьСоединение(Адрес, SSL);
|
||||
Соединение = ОткрытьСоединение(Адрес);
|
||||
|
||||
Если Не ЗначениеЗаполнено(Соединение) Тогда
|
||||
ВызватьИсключение "Не удалось создать Соединение";
|
||||
КонецЕсли;
|
||||
|
||||
Сообщение = ПолучитьДанные(Соединение, ДлительностьПопытки, ЧислоПопыток, МаксимальныйРазмер);
|
||||
Сообщение = ПрочитатьДвоичныеДанные(Соединение, МаксимальныйРазмер, Таймаут);
|
||||
|
||||
Если Строкой Тогда
|
||||
Сообщение = ПолучитьСтрокуИзДвоичныхДанных(Сообщение);
|
||||
Сообщение = ПолучитьСтрокуИзДвоичныхДанных(Сообщение, Кодировка);
|
||||
КонецЕсли;
|
||||
|
||||
ЗакрытьСоединение(Соединение);
|
||||
|
@ -2038,9 +2038,9 @@
|
||||
КонецФункции
|
||||
|
||||
Функция ПолучитьОбщийМодуль(Знач Имя)
|
||||
|
||||
|
||||
Модуль = Вычислить(Имя);
|
||||
|
||||
|
||||
Возврат Модуль;
|
||||
КонецФункции
|
||||
|
||||
|
@ -47,23 +47,20 @@
|
||||
|
||||
// !NOCLI
|
||||
// Открыть соединение
|
||||
// Создает TCP/TLS соединение
|
||||
// Создает TCP соединение
|
||||
//
|
||||
// Параметры:
|
||||
// Адрес - Строка - Адрес и порт для подключения - address
|
||||
// SSL - Булево - Признак использования защищенного соединения - ssl
|
||||
// Адрес - Строка - Адрес и порт для подключения - address
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Неопределено, Произвольный - Возвращает объект TCP клиента при успешном подключении или неопределено
|
||||
Функция ОткрытьСоединение(Знач Адрес, Знач SSL = Ложь) Экспорт
|
||||
Функция ОткрытьСоединение(Знач Адрес) Экспорт
|
||||
|
||||
OPI_ПреобразованиеТипов.ПолучитьСтроку(Адрес);
|
||||
OPI_ПреобразованиеТипов.ПолучитьБулево(SSL);
|
||||
|
||||
TCPКлиент = OPI_Инструменты.ПолучитьКомпоненту("TCPClient");
|
||||
|
||||
TCPКлиент.Address = Адрес;
|
||||
TCPКлиент.SSL = SSL;
|
||||
|
||||
Успех = TCPКлиент.Connect();
|
||||
|
||||
@ -85,79 +82,141 @@
|
||||
КонецФункции
|
||||
|
||||
// !NOCLI
|
||||
// Получить данные
|
||||
// Прочитать двоичные данные
|
||||
// Читает данные из указанного соединения
|
||||
//
|
||||
// Примечание:
|
||||
// Метод пытается прочесть данные интервалами, длительность которых указана в параметре ДлительностьПопытки.^^
|
||||
// За максимальное число попыток отвечает параметр ЧислоПопыток. При успешном получении новых данных число попыток сбрасывается.
|
||||
// При работе с бесконечным потоком входящих данных обязательно указание параметра МаксимальныйРазмер, так как^^
|
||||
// бесконечный сброс попыток при получении данных может привести к зависанию
|
||||
// бесконечное получение данных может привести к зависанию
|
||||
// При закрытии соединения, ошибке или обнаружении EOF чтение завершается в любом случае
|
||||
//
|
||||
// Параметры:
|
||||
// Соединение - Произвольный - Соединение, см. ОткрытьСоединение - tcp
|
||||
// ДлительностьПопытки - Число - Интервал между попытками получения данных - timeout
|
||||
// ЧислоПопыток - Число - Максимальное число попыток получения данных - attempts
|
||||
// МаксимальныйРазмер - Число - Максимальный размер данных. 0 > без ограничений - size
|
||||
// Соединение - Произвольный - Соединение, см. ОткрытьСоединение - tcp
|
||||
// МаксимальныйРазмер - Число - Максимальный размер данных (байт). 0 > без ограничений - size
|
||||
// Таймаут - Число - Таймаут ожидания данных (мс). 0 > без ограничений - timeout
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// ДвоичныеДанные - Полученные данные
|
||||
Функция ПолучитьДанные(Знач Соединение
|
||||
, Знач ДлительностьПопытки = 200
|
||||
, Знач ЧислоПопыток = 5
|
||||
, Знач МаксимальныйРазмер = 0) Экспорт
|
||||
Функция ПрочитатьДвоичныеДанные(Знач Соединение, Знач МаксимальныйРазмер = 0, Знач Таймаут = 5000) Экспорт
|
||||
|
||||
OPI_ПреобразованиеТипов.ПолучитьЧисло(ДлительностьПопытки);
|
||||
OPI_ПреобразованиеТипов.ПолучитьЧисло(ЧислоПопыток);
|
||||
OPI_ПреобразованиеТипов.ПолучитьЧисло(Таймаут);
|
||||
OPI_ПреобразованиеТипов.ПолучитьЧисло(МаксимальныйРазмер);
|
||||
|
||||
Возврат Соединение.Read(ДлительностьПопытки, ЧислоПопыток, МаксимальныйРазмер);
|
||||
Данные = Соединение.Read(МаксимальныйРазмер, Таймаут);
|
||||
|
||||
Возврат Данные;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// !NOCLI
|
||||
// Прочитать строку
|
||||
// Читает данные из указанного соединения в виде строки
|
||||
//
|
||||
// Примечание:
|
||||
// При закрытии соединения, ошибке или обнаружении EOF чтение завершается в любом случае
|
||||
//
|
||||
// Параметры:
|
||||
// Соединение - Произвольный - Соединение, см. ОткрытьСоединение - tcp
|
||||
// Кодировка - Строка - Кодировка преобразования данных в строку - enc
|
||||
// Таймаут - Число - Таймаут ожидания данных (мс). 0 > без ограничений - timeout
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Строка - Полученные данные в виде строки
|
||||
Функция ПрочитатьСтроку(Знач Соединение, Знач Кодировка = "UTF-8", Знач Таймаут = 5000) Экспорт
|
||||
|
||||
OPI_ПреобразованиеТипов.ПолучитьСтроку(Кодировка);
|
||||
|
||||
Данные = ПрочитатьДвоичныеДанные(Соединение, , Таймаут);
|
||||
Данные = ПолучитьСтрокуИзДвоичныхДанных(Данные, Кодировка);
|
||||
|
||||
Возврат Данные;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// !NOCLI
|
||||
// Отправить двоичные данные
|
||||
// Отправляет двоичные данные через указанное соединение
|
||||
//
|
||||
// Параметры:
|
||||
// Соединение - Произвольный - Соединение, см. ОткрытьСоединение - tcp
|
||||
// Данные - ДвоичныеДанные - Данные для отправки - data
|
||||
// Таймаут - Число - Таймаут ожидания записи (мс). 0 > без ограничений - timeout
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Булево - Признак успешного выполнения
|
||||
Функция ОтправитьДвоичныеДанные(Знач Соединение, Знач Данные, Знач Таймаут = 5000) Экспорт
|
||||
|
||||
OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Данные);
|
||||
OPI_ПреобразованиеТипов.ПолучитьЧисло(Таймаут);
|
||||
|
||||
Результат = Соединение.Send(Данные, Таймаут);
|
||||
|
||||
Возврат Результат;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// !NOCLI
|
||||
// Отправить строку
|
||||
// Отправляет данные в виде строки через указанное соединение
|
||||
//
|
||||
// Параметры:
|
||||
// Соединение - Произвольный - Соединение, см. ОткрытьСоединение - tcp
|
||||
// Данные - Строка - Данные для отправки в виде строки - data
|
||||
// Кодировка - Строка - Кодировка для записи исходящей строки в поток - enc
|
||||
// Таймаут - Число - Таймаут ожидания записи (мс). 0 > без ограничений - timeout
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Булево - Признак успешного выполнения
|
||||
Функция ОтправитьСтроку(Знач Соединение, Знач Данные, Знач Кодировка = "UTF-8", Знач Таймаут = 5000) Экспорт
|
||||
|
||||
OPI_ПреобразованиеТипов.ПолучитьСтроку(Данные);
|
||||
OPI_ПреобразованиеТипов.ПолучитьСтроку(Кодировка);
|
||||
|
||||
ДанныеДД = ПолучитьДвоичныеДанныеИзСтроки(Данные, Кодировка);
|
||||
|
||||
Результат = ОтправитьДвоичныеДанные(Соединение, ДанныеДД, Таймаут);
|
||||
|
||||
Возврат Результат;
|
||||
|
||||
КонецФункции
|
||||
|
||||
|
||||
// Подключиться и получить данные
|
||||
// Создает соединение и читает данные до конца или по ограничениям
|
||||
//
|
||||
// Примечание:
|
||||
// Метод пытается прочесть данные интервалами, длительность которых указана в параметре ДлительностьПопытки.^^
|
||||
// За максимальное число попыток отвечает параметр ЧислоПопыток. При успешном получении новых данных число попыток сбрасывается.
|
||||
// При работе с бесконечным потоком входящих данных обязательно указание параметра МаксимальныйРазмер, так как^^
|
||||
// бесконечный сброс попыток при получении данных может привести к зависанию
|
||||
// бесконечное получение данных может привести к зависанию
|
||||
// При закрытии соединения, ошибке или обнаружении EOF чтение завершается в любом случае
|
||||
//
|
||||
// Параметры:
|
||||
// Адрес - Строка - Адрес и порт для подключения - address
|
||||
// SSL - Булево - Признак использования защищенного соединения - ssl
|
||||
// ДлительностьПопытки - Число - Интервал между попытками получения данных - timeout
|
||||
// ЧислоПопыток - Число - Максимальное число попыток получения данных - attempts
|
||||
// МаксимальныйРазмер - Число - Максимальный размер данных. 0 > без ограничений - size
|
||||
// Строкой - Булево - Истина > возвращает строку, Ложь > двоичные данные - string
|
||||
// Кодировка - Строка - Кодировка получаемых данных - enc
|
||||
// Адрес - Строка - Адрес и порт для подключения - address
|
||||
// МаксимальныйРазмер - Число - Максимальный размер данных. 0 > без ограничений - size
|
||||
// Таймаут - Число - Таймаут ожидания данных - timeout
|
||||
// Строкой - Булево - Истина > возвращает строку, Ложь > двоичные данные - string
|
||||
// Кодировка - Строка - Кодировка получаемых данных - enc
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Строка, ДвоичныеДанные - Полученные данные
|
||||
Функция ПодключитьсяИПолучитьДанные(Знач Адрес
|
||||
, Знач SSL = Ложь
|
||||
, Знач ДлительностьПопытки = 0
|
||||
, Знач ЧислоПопыток = 5
|
||||
, Знач МаксимальныйРазмер = 0
|
||||
, Знач Таймаут = 5000
|
||||
, Знач Строкой = Истина
|
||||
, Знач Кодировка = "UTF-8") Экспорт
|
||||
|
||||
OPI_ПреобразованиеТипов.ПолучитьБулево(Строкой);
|
||||
OPI_ПреобразованиеТипов.ПолучитьСтроку(Кодировка);
|
||||
|
||||
Соединение = ОткрытьСоединение(Адрес, SSL);
|
||||
Соединение = ОткрытьСоединение(Адрес);
|
||||
|
||||
Если Не ЗначениеЗаполнено(Соединение) Тогда
|
||||
ВызватьИсключение "Не удалось создать Соединение";
|
||||
КонецЕсли;
|
||||
|
||||
Сообщение = ПолучитьДанные(Соединение, ДлительностьПопытки, ЧислоПопыток, МаксимальныйРазмер);
|
||||
Сообщение = ПрочитатьДвоичныеДанные(Соединение, МаксимальныйРазмер, Таймаут);
|
||||
|
||||
Если Строкой Тогда
|
||||
Сообщение = ПолучитьСтрокуИзДвоичныхДанных(Сообщение);
|
||||
Сообщение = ПолучитьСтрокуИзДвоичныхДанных(Сообщение, Кодировка);
|
||||
КонецЕсли;
|
||||
|
||||
ЗакрытьСоединение(Соединение);
|
||||
|
Binary file not shown.
Loading…
Reference in New Issue
Block a user