Impossible de recevoir la réponse de TIdTCPServer à l'aide de TIdTCPClient
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
) ?
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 :
Si vous ne réglez pas
wantedHost
et/ouwantedPort
aux valeurs correctes, vous ne vous connecteriez pas réellement à votre serveur attendu.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, etextractClientName()
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.