А. Григорьев - О чём не пишут в книгах по Delphi

Здесь есть возможность читать онлайн «А. Григорьев - О чём не пишут в книгах по Delphi» — ознакомительный отрывок электронной книги совершенно бесплатно, а после прочтения отрывка купить полную версию. В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Город: СПб, Год выпуска: 2008, ISBN: 2008, Издательство: БХВ-Петербург, Жанр: Программирование, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

О чём не пишут в книгах по Delphi: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «О чём не пишут в книгах по Delphi»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

Рассмотрены малоосвещённые вопросы программирования в Delphi. Описаны методы интеграции VCL и API. Показаны внутренние механизмы VCL и приведены примеры вмешательства в эти механизмы. Рассмотрено использование сокетов в Delphi: различные механизмы их работы, особенности для протоколов TCP и UDP и др. Большое внимание уделено разбору ситуаций возникновения ошибок и получения неверных результатов в "простом и правильном" коде. Отдельно рассмотрены особенности работы с целыми, вещественными и строковыми типами данных, а также приведены примеры неверных результатов, связанных с ошибками компилятора, VCL и др. Для каждой из таких ситуаций предложены методы решения проблемы. Подробно рассмотрен синтаксический анализ в Delphi на примере арифметических выражений. Многочисленные примеры составлены с учётом различных версий: от Delphi 3 до Delphi 2007. Прилагаемый компакт-диск содержит примеры из книги.
Для программистов

О чём не пишут в книгах по Delphi — читать онлайн ознакомительный отрывок

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «О чём не пишут в книгах по Delphi», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

LabelPortNumber.Enabled := False;

EditРоrtNumber.Enabled := False;

BtnStartServer.Enabled := False;

LabelServerState.Caption := 'Сервер работает';

except

on EConvertError do

// Это исключение может возникнуть только в одном месте

// при вызове StrToInt(EditPortNumber.Text)

MessageDlg('"' + EditPortNumber.Text + '"не является целым числом',

mtError, [mbOK], 0);

on ERangeError do

// это исключение может возникнуть только в одном месте -

// при присваивании значения номеру порта

MessageDlg('Номер порта должен находиться в диапазоне 1-65535',

mtError, [mbOK], 0);

end;

end;

Слушающая" нить TListenThreadсостоит из бесконечного ожидания подключения клиента. Каждый раз при подключении клиента библиотека сокетов создаёт новый сокет, и для работы с ним создается новая нить типа TClientThread(листинг 2.20).

Листинг 2.20. Код "слушающей" нити

procedure TListenThread.Execute;

// Сокет, созданный для общения с подключившимся клиентом

ClientSocket: TSocket;

// Адрес подключившегося клиента

ClientAddr: TSockAddr;

ClientAddrLen: Integer;

begin

// Начинаем бесконечный цикл

repeat

ClientAddrLen := SizeOf(ClientAddr);

// Ожидаем подключения клиента

ClientSocket := accept(FServerSocket, @ClientAddr, @ClientAddrLen);

if ClientSocket = INVALID_SOCKET then

begin

// Ошибка в функции accept возникает только тогда, когда

// происходит нечто экстраординарное. Продолжать работу

// в этом случае бессмысленно.

LogMessage('Ошибка при подключении клиента: ' + GetErrorString);

Break;

end;

// Создаем новую нить для обслуживания подключившегося клиента

// и передаём ей сокет, созданный для взаимодействия с ним.

TClientThread.Create(ClientSocket, ClientAddr);

until False;

closesocket(FServerSocket);

LogMessage('Сервер завершил работу');

Synchronize(ServerForm.OnStopServer);

end;

Метод LogMessage, существующий у "слушающей" нити, эквивалентен тому, который приведен в листинге 2.7.

Код нити типа TClientThread, которая отвечает за взаимодействие с одним клиентом, приведен в листинге 2.21.

Листинг 2.21. Код нити, реализующей взаимодействие с клиентом

// Сокет для взаимодействия с клиентом создается в главной нити,

// а сюда передается через параметр конструктора. Для формирования

// заголовка сюда же передается адрес подключившегося клиента

constructor TClientThread.Create(ClientSocket: TSocket; const ClientAddr:TSockAddr);

begin

FSocket := ClientSocket;

// Заголовок содержит адрес и номер порта клиента.

// Этот заголовок будет добавляться ко всем сообщениям в лог

// от данного клиента.

FHeader :=

'Сообщение от клиента ' + inet_ntoa(ClientAddr.sin_addr) + ':' +

IntToStr(ntohs(ClientAddr.sin_port)) + ': ';

inherited Create(False);

end;

procedure TClientThread.Execute; var Str: string; StrLen: Integer;

begin

LogMessage('Соединение установлено');

// Начинаем цикл, из которого выходим только при закрытии

// соединения клиентом или из-за ошибки в сети.

repeat

// Читаем длину присланной клиентом строки и помещаем ее в StrLen

case ReadFromSocket(FSocket, StrLen, SizeOf(StrLen)) of

0: begin

LogMessage('Клиент закрыл соединение');

Break;

end;

-1: begin

LogMessage('Ошибка при получении данных от клиента: ' +

GetErrorString);

Break;

end;

end;

// Протокол не допускает строк нулевой длины

if StrLen <= 0 then

begin

LogMessage('Неверная длина строки от клиента: ' +

IntToStr(StrLen));

Break;

end;

// Установка длины строки в соответствии с полученным значением

SetLength(Str, StrLen);

// Чтение строки нужной длины

case ReadFromSocket(FSocket, Str[1], StrLen) of

0: begin

LogMessage('Клиент закрыл соединение');

Break;

end;

-1: begin

LogMessage('Ошибка при получении данных от клиента: ' +

GetErrorString);

Break;

end;

end;

LogMessage('Получена строка: ' + Str);

// Преобразование строки

Str :=

AnsiUpperCase(StringReplace(Str, #0, '#0', [rfReplaceAll]),

' (Multithreaded server)';

// Отправка строки. Отправляется на один байт больше, чем

// длина строки, чтобы завершающий символ #0 тоже попал в пакет

if send(FSocket, Str[1], Length(Str) + 1, 0) < 0 then

begin

LogMessage('Ошибка при отправке данных клиенту: ' +

GetErrorString);

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «О чём не пишут в книгах по Delphi»

Представляем Вашему вниманию похожие книги на «О чём не пишут в книгах по Delphi» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Отзывы о книге «О чём не пишут в книгах по Delphi»

Обсуждение, отзывы о книге «О чём не пишут в книгах по Delphi» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x