Indy的idSimpleServer重新连接

时间:2014-03-12 15:46:54

标签: indy delphi-xe5

我希望能够在一个客户端连接到它之后重新连接到idSimpleServer,然后断开连接。第一个客户端可以连接和断开没有问题,但下一个客户端不能。我做了一个简单的测试程序来证明我的问题。

procedure Tfrmmain.btnBlockingClick(Sender: TObject);
begin
  Server1.BeginListen;
  Server1.Listen;
  CodeSite.Send(csmLevel2, 'Listen');
  CodeSite.Send(csmLevel2, 'Server1.IOHandler.Connected', Server1.IOHandler.Connected);
  try
    while (Server1.Connected) do
    begin
      while Server1.IOHandler.CheckForDataOnSource() do
      begin
        CodeSite.Send(csmLevel3, 'InputBufferAsString', Server1.IOHandler.InputBufferAsString);
        Server1.IOHandler.WriteLn('0006CANPDD');
      end;
    end;
  finally
    Server1.Disconnect;
    CodeSite.Send(csmLevel4, 'Finally');
  end;
end;

这会在我的codesite日志中提供以下结果:

Listen
Server1.IOHandler.Connected = True
Finally
Listen
Server1.IOHandler.Connected = False
Finally

注意第二个连接似乎没有正确绑定IOHandler。不知道我应该在哪里看。有什么想法吗?

由于

史蒂夫

1 个答案:

答案 0 :(得分:1)

问题是您每次都在重复使用相同的TIdSimpleServer对象。

第一次断开连接后,相同的IOHandler将重复用于下一次连接,但IOHandler.ClosedGracefully属性从之前的连接保持为true,因为每次都不会重置。{1}}属性。 ClosedGracefully属性仅由IOHander.Open()方法重置,TIdSimpleServer仅在创建新IOHandler时调用Disconnect()IOHandler不会释放IOHandler.Close(),但会调用Open()

在后续连接上对TIdSimpleServer.IOHandler的遗失调用看起来像是一个错误,所以我已经检查了它到Indy的SVN(rev 5103)。

您可以升级到latest SVN release,否则您必须在每个连接之间销毁TIdSimpleServer(或{{1}}本身)。