Indy поддерживает несколько методов, для чтения и записи,
которые отвечают различным потребностям. Эти методы также включают – ожидание,
проверку состояния и опрос.
Каждый из методов – это подмножество класса TIdTCPConnection. Это зависит от типа каждого серверного соединения и
являются наследником TIdTCPClient.
Это означает, что вы можете использовать эти методы, как для серверов, так и
для клиентов.
Большинство людей знакомы только с некоторыми методами
чтения и записи. Поскольку, многие люди никогда не используют ядро клиентов, а
работают только с протоколами клиентов и не знакомы с методами ядра.
Вспомни, что Indy
блокирующий, и не использует событий для оповещения об окончании запрошенной
операции. Возврат из методов не происходит до окончания запрошенной операции.
Если операция не может быть выполнена, то возбуждается исключение.
В данной книге не приводится полный набор документации
по всем методам. Для этого вы должны смотреть справки по Indy. Данная глава просто написана для ознакомления с
методами.
function AllData: string;
Функция AllData
блокирует и собирает все входящие данные, до разъединения соединения. Затем
возвращает все собранные данные в качестве результата. AllData полезен для протоколов аналогичным WhoIs, после получения запроса, возвращает данные и сигнал,
что соединение прекращено. AllData хранит
свои буферы в оперативной памяти, поэтому не стоит использовать ее для больших
по размеру данных.
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 читает данные, пока не встретит указанный
ограничитель в строке.
function
CurrentReadBuffer: string;
Функция CurrentReadBuffer
возвращает все данные, которые находятся во внутреннем буфере Indy. Перед возвратом данных, CurrentReadBuffer также пытается прочитать все данные, которые она
ожидает от подсоединенного сокета. Вызов CurrentReadBuffer очищает внутренний буфер.
Если данных нет, то возвращается пустая строка.
property InputBuffer:
TIdManagedBuffer read FInputBuffer;
Свойство InputBuffer
– это ссылка на экземпляр объекта TIdManagedBuffer. InputBuffer – это внутренний буфер
Indy. TIdManagedBuffer
имеет несколько расширенных буферов, но обычно пользователь не использует их.
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 полезна, когда вы не желаете отображать принятые символы,
например пароль.
procedure ReadBuffer(var
ABuffer; const AByteCount: Longint);
Процедура ReadBuffer
используется для чтения данных напрямую в указанный буфер. Если буфер
недостаточен, то процедура ReadBuffer
читает данные во внутренний буфер.
function ReadCardinal(const
AConvert: boolean = true): Cardinal;
Функция ReadCardinal
читает 32-битное число без знака из соединения, с дополнительным учетом сетевого порядка байт.
function ReadFromStack(const
ARaiseExceptionIfDisconnected: Boolean = True; ATimeout: Integer =
IdTimeoutDefault;
Функция ReadFromStack
используется для заполнения внутреннего буфера Indy. Обычно конечные пользователи никогда не должны
использовать эту функцию, поскольку она
реализует новый метод чтения без использования текущих методов чтения, или
когда они работают напрямую с внутренним буфером с помощью свойства InternalBuffer.
function ReadInteger(const
AConvert: boolean = true): Integer;
Функция ReadInteger
читает r 32-битное число со знаком из соединения, с
дополнительным учетом сетевого порядка
байт.
function
ReadLn(ATerminator: string = LF; const ATimeout: Integer =
IdTimeoutDefault; AMaxLineLength: Integer = -1): string; virtual;
Функция ReadLn читает
данные из соединения, пока не встретит указанный ограничитель, в течение
периода таймаута или в случае приема указанной максимальной длины строки.
function
ReadLnWait(AFailCount: Integer = MaxInt): string;
Функция ReadLnWait
подобна функции ReadLn с одним исключением, что
она не возвращает результат, пока не примет, не пустую строку. Она также вернет
количество принятых пустых строк.
function ReadSmallInt(const AConvert: Boolean = true): SmallInt;
Функция ReadSmallInt
читает короткое целое из соединения, дополнительно делая подстройку под сетевой
порядок байт.
procedure
ReadStream(AStream: TStream; AByteCount: LongInt = -1; const
AReadUntilDisconnect: boolean = false);
Функция ReadStream
читает данные из потока. В функции может быть указано количество байт, для
чтения из потока или до отсоединения.
function ReadString(const
ABytes: Integer): string;
Функция ReadString
читаетуказанное количество байт в строку и возвращает данные как результат.
procedure ReadStrings(var
AValue: TStrings; AReadLinesCount: Integer = -1);
Процедура ReadStrings
читает указанное количество строк, разделенных символом EOLs из соединения. Если количество строк не указано, то
читается первое 32-битное целое из соединение и оно используется далее как
количество строк.
function WaitFor(const
AString: string): string;
Функция WaitFor читает
данные из соединения, пока не встретит указанную строку.
TIdTCPConnection (Все TCP клиенты и
соединения, которые унаследованы от TIdTCPConnection) имеет свойство, названое ReadTimeout.
Свойство ReadTimeout указывает таймаут в
миллисекундах. Значением свойства по умолчанию является IdTimeoutInfinite. Данная установка запрещает таймауты.
Таймаут не является таймаутом окончания работы. Это
просто пустой таймаут. Что это значит, если указанная величина в свойстве ReadTimeout прошло и не данных для записи, то будет возбуждено
исключение EIdReadTimeout.
Многие сетевые соединения бывают очень медленные и данные не
передавались, но соединение остается действительным. В такой ситуации,
соединение может стать медленным и неприемлемым и будет только приводить к
нагрузке сервера и малопригодным для клиента.
Чтобы можно было оперировать такой ситуацией Indy реализует таймауты с помощью свойство ReadTimeout класса TIdTCPConnection.
Свойство ReadTimeout по умолчанию равно
нулю, которое запрещает обработку таймаутов. Для разрешения обработки таймаутов
установите его значение в миллисекундах.
Во время чтения, если в течение указанного интервала
не будет приема данных из соединения, то возникнет исключение EIdReadTimeout. Таймаут не применяется если принимаются данные в
течение периода. Если вы запросили 100 байт и таймаут 1000 миллисекунд (1
секунда) операция чтения может занять более одной секунды. От
переводчика: если в будет в течение каждой секунды принимать по одному байту,
то в результате прием займет 100 секунд.
Только если в течение одной секунды не будет принято
ни одного байта, только тогда возникнет исключение EIdReadTimeout.
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.
procedure Write(AOut: string);
Процедура Write это
наиболее общий метод вывода в Indy. Процедура Write посылает AOut в соединение. Процедура Write не изменяет AOut ни каким образом.
procedure WriteBuffer(const
ABuffer; AByteCount: Longint; const AWriteNow: Boolean = False);
Процедура WriteBuffer
позволяет послать содержимое буфера. Если AWriteNow указано, то буферизация в процедуре write будет опущено, если оно в данный момент используется.
procedure
WriteCardinal(AValue: Cardinal; const AConvert: Boolean = True);
Процедура WriteCardinal посылает 32-битное, целое без знака в соединение, дополнительно преобразовывая
в сетевой порядок байт.
procedure
WriteHeader(AHeader: TStrings);
Процедура WriteHeader
посылает объект TStrings в соединения,
преобразовывая '=' в ': ' последовательность каждое вхождение item. Процедура WriteHeader
также записывает пустую строку после передачи всего объекта TStrings.
procedure
WriteInteger(AValue: Integer; const AConvert: Boolean = True);
Процедура WriteInteger
посылает 32-битное, целое знаковое в соединение, дополнительно преобразовывая в
сетевой порядок байт.
procedure WriteLn(const
AOut: string = '');
Процедура WriteLn
выполняет те же функции, как и процедура Write с одним исключением, что она добавляет
последовательность EOL (CR + LF) после AOut параметра.
procedure
WriteRFCReply(AReply: TIdRFCReply);
Процедура WriteRFCReply посылает цифру ответа + текст в RFC стиле, используя указанный TIdRFCReply.
procedure
WriteRFCStrings(AStrings: TStrings);
Процедура WriteRFCStrings посылает TStrings ответ в стиле RFC сообщений, заканчивая строкой с '.' в начале.
procedure
WriteSmallInt(AValue: SmallInt; const AConvert: Boolean = True);
Процедура WriteSmallInt посылает small integer в соединение, дополнительно преобразовывая в сетевой
порядок байт.
procedure
WriteStream(AStream: TStream; const AAll: Boolean = True; const
AWriteByteCount: Boolean = False; const ASize: Integer = 0);
Процедура WriteStream
посылает указанный поток данных (stream) в соединение. Процедура WriteStream содержит много параметров для указания какие части
потока должны быть посланы и дополнительно может посылать количество байт в
поток.
procedure
WriteStrings(AValue: TStrings; const AWriteLinesCount: Boolean = False);
Процедура WriteStrings
посылает объект TStrings в соединение и копию в ReadStrings.
function WriteFile(AFile:
String; const AEnableTransferFile: Boolean = False): Cardinal;
Функция WriteFile – это
функция прямой посылки содержимого файла в соединение. Функция WriteFile использует операционную систему, просто используя TFileStream вместе с SendStream.