我希望能够在一个客户端连接到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;这在我的代码日志中给出了以下结果:
Listen
Server1.IOHandler.Connected = True
Finally
Listen
Server1.IOHandler.Connected = False
Finally注意,第二个连接似乎没有正确地绑定IOHandler。不知道我该去哪找。有什么想法吗?
谢谢
史蒂夫
发布于 2014-03-12 17:46:02
问题是每次都重用同一个TIdSimpleServer对象。
在第一个断开连接之后,将对下一个连接重用相同的IOHandler,但是IOHandler.ClosedGracefully属性从早期的连接中保持为真,因为它不是每次都被重置。ClosedGracefully属性仅由IOHander.Open()方法重置,TIdSimpleServer只在创建新的IOHandler时调用该方法。Disconnect()不释放IOHandler,但它确实调用了IOHandler.Close()。
对我来说,在后续连接中缺少的对Open()的调用就像是一个bug,因此我已经为Indy的SVN (rev 5103)签了一个补丁。
您可以升级到最新SVN发行版,或者必须在每个连接之间销毁TIdSimpleServer.IOHandler (或TIdSimpleServer本身)。
https://stackoverflow.com/questions/22356723
复制相似问题