Question

Je souhaite établir une communication entre TIdTCPServer et TIdTCPClient en Delphi et voici à quoi ressemblent mes procédures :
1.Côté serveur :

procedure TMainForm.IdTCPServer1Execute(AContext: TIdContext);
var
  clientReq, clientName : String;
begin
  clientReq := AContext.Connection.IOHandler.ReadLn(); // client sends request
  clientName := extractClientName(clientReq);  
  AContext.Connection.IOHandler.WriteLn('Hello ' + clientName);
end;

2.Côté client :

procedure TMainForm.btnTestClientClick(Sender: TObject);
var
  testTCP : TIdTCPClient;
  clientReq, serverResponse : String;
begin
  testTCP := TIdTCPClient.Create;
  try
    testTCP.Host := wantedHost;
    testTCP.Port := wantedPort;
    testTCP.Connect;
    clientReq := 'Hello, my Name is user1.';
    testTCP.IOHandler.WriteLn(clientReq);
    try
      serverResponse := testTCP.IOHandler.ReadLn();
    except on e : Exception do begin
      ShowMessage('Error reading response =' + e.Message);
    end;
    end;
  finally
    FreeAndNil(testTCP);
  end;
end;

Je me connecte au serveur mais mon application se bloque lorsque j'essaie de recevoir la réponse du serveur OnExecute événement avec mon TCPClient.IOHandler.ReadLn méthode.Quelqu'un peut-il m'aider à corriger mon code ou me montrer un exemple concret de ce que j'essaie de faire (avec Indy's TIdTCPClient et TIdTCPServer) ?

Était-ce utile?

La solution

Il n'y a rien de mal avec le code que vous avez montré, le problème doit donc provenir du code que vous n'avez pas montré.D'après moi, il y a deux possibilités :

  1. Si vous ne réglez pas wantedHost et/ou wantedPort aux valeurs correctes, vous ne vous connecteriez pas réellement à votre serveur attendu.

  2. Si extractClientName() est bloqué en interne et ne se ferme pas, le serveur n'enverra aucune réponse.Cela pourrait se produire si vous exécutez le client et le serveur dans le même processus, et extractClientName() se synchronise avec le thread principal, mais le thread principal est bloqué en attendant le client et ne peut pas traiter la synchronisation, donc un blocage se produit.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top