Меню сайта
Форма входа
Категории раздела
Общие статьи об INDY [6] INDY IN DEPTH [18]
Учебник созданный авторами INDY
Видеоуроки INDY [3] Основы Delphi [9]
Работа с файлами [6]
Главная » Статьи » Delphi » INDY IN DEPTH

Чтение и запись
 
INDY IN DEPTH. ГЛУБИНЫ INDY

 

8. Чтение и запись

 

Indy поддерживает несколько способов, для чтения и записи, которые отвечают разным потребностям. Эти способы также так сказать включают – ожидание, проверку состояния и опрос.
Любой из способов – это подмножество класса TIdTCPConnection. Это зависит от типа каждого серверного соединения и наконец-то являются наследником TIdTCPClient. Это значит, что вы сможете применять эти способы, как для серверов, так и для клиентов.

Большая часть людей знакомы лишь с некими способами чтения и записи. Так как, почти все люди никогда не употребляют ядро клиентов, а, стало быть, работают лишь с протоколами клиентов не знакомы с способами ядра.

Вспомни, что Indy блокирующий, не употребляет событий для оповещения о окончании запрошенной операции. Возврат из способов не происходит до окончания запрошенной операции. Ежели операция не быть может, мягко говоря, выполнена, то возбуждается исключение.

В данной книжке не приводится полный набор документации по всем способам. Для этого вы должны глядеть справки по Indy. Данная глава просто написана для ознакомления с способами.

8.1. Способы чтения

8.1.1. Функция AllData

  function AllData: string;

Функция AllData перекрывает и, в конце концов, собирает все входящие данные, до разъединения соединения. Потом возвращает все собранные данные в качестве результата. AllData полезен для протоколов аналогичным WhoIs, после получения запроса, возвращает данные и сигнал, что соединение прекращено. AllData хранит свои буферы в оперативной памяти, потому не, стало быть, стоит употреблять ее для огромных по размеру данных.

8.1.2. Процедура Capture

procedure Capture(ADest: TStream; const ADelim: string = '.'; const AIsRFCMessage: Boolean = True); overload;
procedure Capture(ADest: TStream; out VLineCount: Integer; const ADelim: string = '.'; const AIsRFCMessage: Boolean = True); overload;
procedure Capture(ADest: TStrings; const ADelim: string = '.'; const AIsRFCMessage: Boolean = True); overload;
procedure Capture(ADest: TStrings; out VLineCount: Integer; const ADelim: string = '.'; const AIsRFCMessage: Boolean = True); overload;

Процедура Capture существует в пары перекрытых формах. Суммируя, Capture читает данные, пока не встретит указанный ограничитель в строке.

8.1.3. Функция CurrentReadBuffer


function CurrentReadBuffer: string;

Функция CurrentReadBuffer возвращает все данные, которые, наконец, находятся во внутреннем буфере Indy. Перед возвратом данных, CurrentReadBuffer также пробует прочесть все данные, которые она ждет от, как мы с вами постоянно говорим, подсоединенного сокета. Вызов CurrentReadBuffer очищает внутренний буфер.

Ежели данных нет, то ворачивается пустая строчка.

8.1.4. Свойство InputBuffer


property InputBuffer: TIdManagedBuffer read FInputBuffer;


Свойство InputBuffer – это ссылка на экземпляр объекта TIdManagedBuffer. InputBuffer – это внутренний буфер Indy. TIdManagedBuffer имеет несколько расширенных буферов, но традиционно юзер не употребляет их.

8.1.5. Функция InputLn

function InputLn(const AMask: String = ''; AEcho: Boolean = True; ATabWidth: Integer = 8; AMaxLineLength: Integer = -1): String;

Функция InputLn читает строчку от сервере и возвращает е обратно reads a line from the server and echoes it back honoring the backspace character. Ежели параметр AMask указан, то строчка AMask отсылается заместо каждого принятого знак. Функция InputLn полезна, когда вы не желаете, в конце концов, показывать принятые знаки, к примеру пароль.

8.1.6. Процедура ReadBuffer


procedure ReadBuffer(var ABuffer; const AByteCount: Longint);
Процедура ReadBuffer употребляется для чтения данных впрямую в указанный буфер. Ежели буфер недостаточен, то процедура ReadBuffer читает данные во внутренний буфер.

8.1.7. Функция ReadCardinal

function ReadCardinal(const AConvert: boolean = true): Cardinal;

Функция ReadCardinal читает 32-битное число без знака из соединения, с доп учетом, как люди привыкли выражаться, сетевого порядка б.

8.1.8. Функция ReadFromStack

function ReadFromStack(const ARaiseExceptionIfDisconnected: Boolean = True; ATimeout: Integer = IdTimeoutDefault;

Функция ReadFromStack употребляется для наполнения внутреннего буфера Indy. Традиционно конечные юзеры никогда не должны употреблять эту функцию, так как она реализует новейший способ чтения без использования текущих способов чтения, либо когда они работают впрямую с внутренним буфером при помощи характеристики InternalBuffer.

8.1.9. Функция ReadInteger

function ReadInteger(const AConvert: boolean = true): Integer;

Функция ReadInteger читает r 32-битное число со знаком из соединения, с как бы доп учетом сетевого порядка б.

8.1.10. Функция ReadLn

function ReadLn(ATerminator: string = LF; const ATimeout: Integer = IdTimeoutDefault; AMaxLineLength: Integer = -1): string; virtual;

Функция ReadLn читает данные из соединения, пока не встретит указанный ограничитель, в течение периода таймаута либо в случае приема, как мы с вами постоянно говорим, указанной наибольшей длины строчки.

8.1.11. Функция ReadLnWait


function ReadLnWait(AFailCount: Integer = MaxInt): string;

Функция ReadLnWait подобна функции ReadLn с одним исключением, что она не, вообщем то, возвращает итог, пока не воспримет, не пустую строчку. Она также вернет количество принятых пустых строк.

8.1.12. Функция ReadSmallIn
t

function ReadSmallInt(const AConvert: Boolean = true): SmallInt;

Функция ReadSmallInt читает короткое целое из соединения, дополнительно делая подстройку под сетевой порядок б.

8.1.13. Процедура ReadStream

procedure ReadStream(AStream: TStream; AByteCount: LongInt = -1; const AReadUntilDisconnect: boolean = false);

Функция ReadStream читает данные из потока. В функции быть может указано количество б, для чтения из потока либо до отсоединения.

8.1.14. Функция ReadString

function ReadString(const ABytes: Integer): string;

Функция ReadString читаетуказанное количество б в строчку и возвращает данные как итог.

8.1.15. Процедура ReadStrings


procedure ReadStrings(var AValue: TStrings; AReadLinesCount: Integer = -1);

Процедура ReadStrings читает указанное количество строк, разбитых эмблемой EOLs из соединения. Ежели количество строк не указано, то читается 1-ое 32-битное целое из соединение и оно употребляется дальше как количество строк.

8.1.16. Функция WaitFor


function WaitFor(const AString: string): string;

Функция WaitFor читает данные из соединения, пока не так сказать встретит, как большая часть из нас постоянно говорит, указанную строчку.

8.2. Таймауты чтения


TIdTCPConnection (Все TCP клиенты и соединения, которые унаследованы от TIdTCPConnection) имеет свойство, названое ReadTimeout. Свойство ReadTimeout показывает таймаут в миллисекундах. Значением характеристики по умолчанию является IdTimeoutInfinite. Данная установка, мягко говоря, запрещает таймауты.

Таймаут не является таймаутом окончания работы. Это просто пустой таймаут. Что это означает, ежели указанная величина в свойстве ReadTimeout прошло не данных для записи, то будет возбуждено исключение EIdReadTimeout.

Почти все сетевые соединения бывают чрезвычайно медленные и данные не как раз передавались, но соединение остается реальным. В таковой ситуации, соединение может стать, как все говорят, медленным и неприемлемым и, стало быть, будет лишь приводить к перегрузке сервера и, как большая часть из нас постоянно говорит, малопригодным для клиента.

Чтоб можно было оперировать таковой ситуацией Indy реализует таймауты при помощи свойство ReadTimeout класса TIdTCPConnection. Свойство ReadTimeout по умолчанию равно нулю, которое также запрещает обработку таймаутов. Для разрешения обработки таймаутов установите его значение в миллисекундах.

Во время чтения, ежели в течение указанного интервала не будет приема данных из соединения, то возникнет исключение EIdReadTimeout. Таймаут не применяется ежели принимаются данные в течение периода. Ежели вы запросили 100 б и таймаут 1000 миллисекунд (1 секунда) операция чтения может занять наиболее одной секунды. От переводчика: ежели в, стало быть, будет в течение каждой секунды принимать по одному б, то в итоге прием также займет 100 секунд.

Лишь ежели в течение одной секунды не будет принято ни 1-го б, лишь тогда возникнет исключение EIdReadTimeout.

8.3. Способы записи

8.3.1. Функция SendCmd

function SendCmd(const AOut: string; const AResponse: SmallInt = -1): SmallInt; overload;
function SendCmd(const AOut: string; const AResponse: Array of SmallInt): SmallInt; overload;

Функция SendCmd употребляется для передачи текстовой команды и ждет ответа в формате цифровых ответов RFC.

8.3.2. Процедура Write


procedure Write(AOut: string);

Процедура Write это более общий способ вывода в Indy. Процедура Write отправляет AOut в соединение. Процедура Write не изменяет AOut ни каким образом.

8.3.3. Процедура WriteBuffer

procedure WriteBuffer(const ABuffer; AByteCount: Longint; const AWriteNow: Boolean = False);

Процедура WriteBuffer дозволяет, в конце концов, отправить содержимое буфера. Ежели AWriteNow указано, то буферизация в процедуре write будет опущено, ежели оно на этот момент как раз употребляется.

8.3.4. Процедура WriteCardinal

procedure WriteCardinal(AValue: Cardinal; const AConvert: Boolean = True);

Процедура WriteCardinal отправляет 32-битное, целое без знака в соединение, дополнительно преобразовывая в, как мы выражаемся, сетевой порядок б.

8.3.5. Процедура WriteHeader

procedure WriteHeader(AHeader: TStrings);

Процедура WriteHeader отправляет объект TStrings в соединения, преобразовывая '=' в ': ' последовательность каждое вхождение item. Процедура WriteHeader также как раз записывает пустую строчку после передачи всего объекта TStrings.

8.3.6. Процедура WriteInteger

procedure WriteInteger(AValue: Integer; const AConvert: Boolean = True);

Процедура WriteInteger отправляет 32-битное, целое знаковое в соединение, дополнительно преобразовывая в, как всем известно, сетевой порядок б.

8.3.7. Процедура WriteLn

  procedure WriteLn(const AOut: string = '');

Процедура WriteLn выполняет те же функции, как и процедура Write с одним исключением, что она так сказать добавляет последовательность EOL (CR + LF) после AOut параметра.

8.3.8. Процедура WriteRFCReply


  procedure WriteRFCReply(AReply: TIdRFCReply);

Процедура WriteRFCReply отправляет цифру ответа + текст в RFC стиле, используя указанный TIdRFCReply.

8.3.9. Процедура WriteRFCStrings

  procedure WriteRFCStrings(AStrings: TStrings);

Процедура WriteRFCStrings отправляет TStrings ответ в стиле RFC сообщений, заканчивая строчкой с '.' сначала.

8.3.10. Процедура WriteSmallInt

  procedure WriteSmallInt(AValue: SmallInt; const AConvert: Boolean = True);

Процедура WriteSmallInt отправляет small integer в соединение, дополнительно преобразовывая в сетевой порядок б.

8.3.11. Процедура WriteStream

procedure WriteStream(AStream: TStream; const AAll: Boolean = True; const AWriteByteCount: Boolean = False; const ASize: Integer = 0);

Процедура WriteStream отправляет указанный поток данных (stream) в соединение. Процедура WriteStream содержит, как все знают, много характеристик для указания какие части потока должны быть посланы и дополнительно может посылать количество б в поток.

8.3.12. Процедура WriteStrings

procedure WriteStrings(AValue: TStrings; const AWriteLinesCount: Boolean = False);
Процедура WriteStrings отправляет объект TStrings в соединение и копию в ReadStrings.

8.3.13. Функция WriteFile

function WriteFile(AFile: String; const AEnableTransferFile: Boolean = False): Cardinal;

Функция WriteFile – это функция прямой посылки содержимого файла в соединение. Функция WriteFile употребляет, как многие выражаются, операционную систему, просто используя TFileStream совместно с SendStream.

8.4. Буферизация записи

TCP должен посылать данные пакетами. Размер пакетов может изменяться, но обычно он немногим наименее 1 кб. Тем более, ежели TCP ждет полного пакета данных, во почти всех вариантах ответы могут быть не, вообщем то, получены, так как запросы не были отосланы. TCP может употреблять полные либо неполные пакеты, Для неполных пакетов можно употреблять метод названый Nagle Coalescing. Nagle Coalescing внутренне, наконец, буферизует данные, пока не будет достигнут указанный размер пакета либо не истечет рассчитанное количество времени. Период времени традиционно небольшой и измеряется в миллисекундах.

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

Данные могут, стало быть, буферизироваться в строчку и быть посланы за раз, тем более это просит писать доп код и исключает внедрение всех способов записи во время буферизации. Это также может, наконец, усложнить ваш код и, вообщем то, прирастить потребности в памяти.

Заместо этого, вы сможете применять способности Indy по буферизации записи. При использовании способов записи с буферизацией, вы сможете дозволить Indy буферизировать исходящие данные, что дозволит для вас употреблять все вероятные способы записи.

Для начала буферизации записи, вызовите способ OpenWriteBuffer и укажите размер буфера. Потом вы сможете, стало быть, вызывать все функции записи в Indy, и весь вывод будет, наконец, буферизироваться, пока буфер не будет заполнен. Каждый раз когда, стало быть, будет достигнут размер буфера, буфер посылается в соединение и очищается. Ежели размер буфера не указан, все данные буферизуются и должны быть вручную высланы.

Имеется также несколько способов для управления буфером.

ClearWriteBuffer очищает текущий буфер и сохраняет буфер открытым. FlushWriteBuffer сбрасывает текущее содержимое и также как раз сохраняет буфер открытым.

Для прекращения буферизации записи, вызовите CancelWriteBuffer либо CloseWriteBuffer. CloseWriteBuffer записывает имеющие данные и, наконец, кончает буферизацию записи, а CancelWriteBuffer закрывает буферизацию записи, без передачи.

8.5. Работа транзакций

Транзакции употребляются для определения единиц работы. Они именуются рабочие транзакции и могут быть вложенными, и отделяют операции чтения и записи, которые могут быть одновременными. Рабочие транзакции традиционно употребляются для отображения прогресса и состояния передачи.

Транзакции определены в Indy разными, предопределенными способами, таковыми как TIdHTTP.Get, WriteStream и т.д.. Как юзер, вы также сможете найти свои собственные транзакции, при помощи BeginWork, DoWork и EndWork.

8.5.1. Действия OnWork

Действия OnWork состоят из 3-х событий и употребляется для связи состояний транзакций. Эти три действия последующие: OnWorkBegin, OnWork и OnWorkEnd.

При начале транзакции, стало быть, возникает событие OnWorkBegin. В событие OnWorkBegin передаются Sender, WorkMode и WorkCount. Параметр Sender это соединение, к которому относится транзакция. Параметр WorkMode показывает режим работы – читающая либо пишущая транзакция. Транзакции Read и Write могут возникать сразу и транзакции могут быть вложенными. Параметр WorkCount показывает размер транзакции. Во почти всех транзакциях, размер не быть может определен, и в данном случае, WorkCount имеет значение 0. По другому, WorkCount указывает количество б. Традиционно данное событие, наконец, употребляется для отображения начала процесса.

Потом возникает серия событий OnWork. В событие OnWork передаются Sender, WorkMode и текущий WorkCount. Данное событие употребляется для отображения прогресса.

Когда транзакция кончает, возникает событие OnWorkEnd. В событие OnWorkEnd OnWork передаются лишь Sender и WorkMode. Данное событие употребляется для отображения завергения процесса.

8.5.2. Управление своими своими рабочими транзакциями

Вы сможете создавать свои собственные транзакции, вызывая BeginWork, DoWork и EndWork. Характеристики те же, как заведено, самые, что описаны выше. Вызовы, как заведено, вложенных транзакций обслуживаются автоматом.

Для выполнения транзакции, поначалу вызовите BeginWork с указанием размера, ежели он известен. Потом вызывайте DoWork для отображения прогресса. По окончанию вызовите EndWork.
Категория: INDY IN DEPTH | Добавил: nazgull (05.02.2012)
Просмотров: 3555 | Теги: ввод и вывод инди, Чтение и запись инди, input indy, Чтение и запись indy | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Ссылки