Как отправить текст из Indy TCPServer в TCPClient - PullRequest
0 голосов
/ 30 октября 2018

Мне нужно простое исправление в моем приложении чата, сделанное с TIdTCPServer и TIdTCPClient. Пожалуйста, без дополнительного кода, просто отправьте и получите текст.

procedure TServerApp1.Button1Click(Sender: TObject);
var
  AContext : TIdContext;
begin
  AContext.Connection.Socket.Write(length(newMSG.Text));
  AContext.Connection.Socket.Write(newMSG.Text);
end;

1 Ответ

0 голосов
/ 30 октября 2018

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 и создавать чат?

...