Search code examples
delphitcpclientindytcpserver

Unable to receive response from TIdTCPServer using TIdTCPClient


I want to establish a communication between TIdTCPServer and TIdTCPClient in delphi and this is how my procedures look :
1.Server side :

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.Client side :

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;

I connect to the server but than my application freezes when I try to receive the response from the server OnExecute event with my TCPClient.IOHandler.ReadLn method. Can anyone help me fix my code or show me a working example of what I'm trying to do (with Indy's TIdTCPClient and TIdTCPServer) ?


Solution

  • There is nothing wrong with the code you have shown, so the problem has to be in the code you have not shown. The way I see it, there are two possibilities:

    1. If you are not setting wantedHost and/or wantedPort to the correct values, you would not actually be connecting to your expected server.

    2. If extractClientName() is getting stuck internally and not exiting, the server would not be sending any response. One way that could happen is if you are running the client and server in the same process, and extractClientName() syncs with the main thread, but the main thread is blocked waiting on the client and cannot process the sync, so a deadlock occurs.