我希望能够在一个客户端连接到它之后重新连接到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。不知道我应该在哪里看。有什么想法吗?
由于
史蒂夫
答案 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}}本身)。