Impossibile ricevere risposta da TidtcPserver usando TidtcpClient
Domanda
Voglio stabilire una comunicazione tra TIdTCPServer
e TIdTCPClient
in Delfi ed è così che le mie procedure guardano:
1. lato del server:
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. Side lato:
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;
.
Mi collego al server ma rispetto alla mia applicazione si blocca quando provo a ricevere la risposta dall'evento del server OnExecute
con il mio metodo TCPClient.IOHandler.ReadLn
.Qualcuno può aiutarmi a risolvere il mio codice o mostrarmi un esempio di funzionamento di ciò che sto cercando di fare (con TIdTCPClient
e TIdTCPServer
di Indy)?
Soluzione
Non c'è niente di sbagliato nel codice che hai mostrato, quindi il problema deve essere nel codice che non hai mostrato.Il modo in cui lo vedo, ci sono due possibilità:
- .
-
Se non si imposta
wantedHost
e / owantedPort
nei valori corretti, non si collegherebbe effettivamente al tuo server previsto. -
Se
extractClientName()
si sta bloccando internamente e non uscendo, il server non invierebbe alcuna risposta.Un modo in cui potrebbe accadere è se si esegue il client e il server nello stesso processo e si sincronizzanoextractClientName()
con il thread principale, ma il thread principale è bloccato in attesa del client e non può elaborare la sincronizzazione, quindi si verifica un deadlock.