无法使用TIdTCPClient从TIdTCPServer接收响应

时间:2014-06-04 10:16:05

标签: delphi tcpclient indy tcpserver

我想在delphi中建立TIdTCPServerTIdTCPClient之间的通信,这就是我的程序: 1.服务器端:

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.客户方:

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;

当我尝试使用OnExecute方法从服务器TCPClient.IOHandler.ReadLn事件接收响应时,我连接到服务器但我的应用程序冻结了。任何人都可以帮我修改我的代码或向我展示我正在尝试做的工作示例(使用Indy的TIdTCPClientTIdTCPServer)吗?

1 个答案:

答案 0 :(得分:1)

您显示的代码没有任何问题,因此问题必须出在您未显示的代码中。我看待它的方式有两种可能性:

  1. 如果您没有将wantedHost和/或wantedPort设置为正确的值,则实际上您不会连接到预期的服务器。

  2. 如果extractClientName()内部卡住但未退出,则服务器不会发送任何响应。可能发生的一种方法是,如果您在同一进程中运行客户端和服务器,并且extractClientName()与主线程同步,但主线程在客户端上被阻塞等待并且无法处理同步,因此出现死锁发生。