TIdTCPServer
имеет свойство Contexts
, содержащее список подключенных клиентов. Вам придется заблокировать и выполнить итерацию по этому списку в поисках клиента для отправки. Например:
procedure TServerApp1.Button1Click(Sender: TObject);
var
Buf: TIdBytes;
List: TIdContextList;
Context: TIdContext;
I: Integer;
begin
// this step is important, as Length(newMSG.Text) will not
// be the actual byte count sent by Write(newMSG.Text)
// if the text contains any non-ASCII characters in it!
Buf := ToBytes(newMSG.Text, IndyTextEncoding_UTF8);
List := IdTCPServer1.Contexts.LockList;
try
for I := 0 to List.Count-1 do
begin
Context := TIdContext(List[I]);
if (Context is the one you are interested in) then
begin
Context.Connection.IOHandler.Write(Length(Buf));
Context.Connection.IOHandler.Write(Buf);
Break;
end;
end;
finally
IdTCPServer1.Contexts.UnlockList
end;
end;
Однако я не рекомендую отправлять сообщения напрямую такому клиенту. Это может вызвать условия гонки, которые могут испортить ваше общение. Более безопасный вариант - предоставить каждому клиенту свою собственную потокобезопасную очередь, в которую вы можете помещать сообщения, когда это необходимо, и тогда у вас может быть обработчик событий TIdTCPServer.OnExecute
, который отправляет сообщения в очереди, когда это безопасно. См. мой ответ на следующий вопрос для примера:
¿Как я могу отправлять и получать строки из tidtcpclient и tidtcpserver и создавать чат?