Для решения поставленной задачи необходимо использовать компонент TIdTCPServer вместо TIdCmdTCPServer, так как последний предназначен для отправки ответов на команды, исходящие от клиента. В случае с TIdTCPServer можно инициативно отправлять данные сервером в клиенты, используя событие OnExecute.
Пример кода для отправки данных всем подключенным клиентам может выглядеть следующим образом:
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
ClientList: TStringList;
begin
// Получаем список всех подключенных клиентов
ClientList := IdTCPServer1.Contexts.Keys;
try
for var i := 0 to ClientList.Count - 1 do
begin
with TIdContext(ClientList[i]) do
begin
// Отправляем сообщение всем клиентам
Connection.IOHandler.WriteLn('Ваше уведомление от сервера');
end;
end;
finally
ClientList.Free;
end;
end;
Этот код должен быть размещен в обработчике события OnExecute компонента TIdTCPServer. При необходимости отправки данных, сервер может выполнить этот метод, чтобы передать сообщение всем клиентам.
Важно отметить, что для асинхронной работы и избежания блокировки потока чтения/записи, необходимо использовать отдельный поток или таймер на стороне клиента для периодической проверки входящих сообщений от сервера. Клиент должен уметь обрабатывать как ответы на команды, так и неожиданные уведомления от сервера.
Пример кода клиента может включать в себя использование TIdTCPClient с отдельным потоком для чтения данных:
procedure TForm1.IdTCPClient1ReadThread;
var
ServerMessage: string;
begin
while IdTCPClient1.Connected do
begin
try
// Чтение сообщения от сервера
ServerMessage := IdTCPClient1.IOHandler.ReadLn;
if Length(ServerMessage) > 0 then
// Обработка полученного сообщения
ShowMessage('Получено уведомление: ' + ServerMessage);
except
on E: Exception do
begin
// Обработка исключений, например при потере соединения
end;
end;
end;
Sleep(100); // Небольшая задержка перед следующей проверкой
end;
Этот код следует запустить в отдельном потоке для постоянного мониторинга сообщений от сервера.
Обратите внимание, что приведенные примеры кода являются упрощенными и предназначены только для демонстрации основных концепций. В реальном приложении потребуется более сложная логика управления сессиями, обработки ошибок и безопасности данных.
Компонент `TIdTCPServer` используется для инициативной отправки данных сервером клиентам, в отличие от `TIdCmdTCPServer`, который предназначен для ответов на команды клиентов.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS