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)?

È stato utile?

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à:

    .
  1. Se non si imposta wantedHost e / o wantedPort nei valori corretti, non si collegherebbe effettivamente al tuo server previsto.

  2. 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 sincronizzano extractClientName() con il thread principale, ma il thread principale è bloccato in attesa del client e non può elaborare la sincronizzazione, quindi si verifica un deadlock.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top