【问题标题】:TIdTCPServer - On unexpected disconnect wait for reconnectTIdTCPServer - 在意外断开连接时等待重新连接
【发布时间】:2013-12-02 19:31:26
【问题描述】:

我有几个使用带有 Indy 组件的 Delphi 6 编写的程序,我正在尝试找出一种方法来暂停 TCP 连接以防意外断开连接。

我们通过 TCP 连接到我们工厂车间的 PLC,但无论出于何种原因(操作员弄乱了他们不应该做的事情、开关暂时关闭、电线故障或其他任何情况),连接都会终止。

这会导致我们的程序难以锁定。一旦 PLC 和 PC 之间发生断开连接,程序会停留很短的时间并最终锁定。

有没有办法在 PLC 和 PC 之间发生断开连接时暂停连接,并在不锁定程序的情况下重新建立连接?

也许也有办法用TIdTCPClient 做到这一点?

如果我需要更具描述性,请说出来,我会尽力做到的。

procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
  i : Integer;
begin

begin
if NOT  IdTCPServer1.Active   then exit;
try

   Comm_Status  :=  True;

 {************************************************
    Clear PC Buffer before Read
  ************************************************}
 for i := 0 to giBufferSize -1 do  begin
     gabToPCBuffer[i] := 0;
 end;

 {************************************************
            Recieve the buffer from PLC
  ************************************************}
    // WE READ
     AThread.Connection.ReadBuffer(gabToPCBuffer, giBufferSize);

     StateMachineLogic;      //Sort Through buffer and copy to server buffer

     // WE SEND back to PLC
     AThread.Connection.WriteBuffer(gabToPLCBuffer, giBufferToPLC );





except
    //;
end;
end;
end;

【问题讨论】:

  • 请显示一些代码。 TIdTCPClient 代码“徘徊”在哪里,它是否在循环中运行读/写套接字操作?您的代码是否抑制了 Indy 套接字操作的异常(使用空的 except 块)?
  • 目前我遇到的最大问题是 IdTCPServer 在发生断开连接时出现故障。使用 IdTCPClient,我只是在寻找信息,因为我们不经常使用它,但有计划。据我所知,连接不断在 PLC 和 PC 之间来回传递缓冲区,没有抑制异常。我可以提取的代码非常基本,但它几乎与我们在任何地方所做的相同。
  • 您确实将 indy 组件更新为最新的 indy9(或更好,10)? D6 附带的组件不是 SMP 安全的。
  • 没有这个版本的delphi除了一些串行组件外几乎是骨干。我们确实有 Delphi 7(也有骨库)和 XE3,但是对于我们目前遇到的问题,它是在 Delphi 6 中制作的。我相信我们可能可以在 delphi 7 或 XE3 中重新编译(希望不必)

标签: delphi indy delphi-6


【解决方案1】:

如果客户端与 TCP 服务器的连接从客户端正常断开,将触发 OnDisconnect 事件。您的线程也将被标记为终止,因此您应该在循环中检查这一点。

但是,对于非正常断开连接,TCP 服务器将在下一次读取或写入时立即出错。您已将读写包装在一个空的 try...except 块中。相反,您应该处理错误并跳出循环。

对于 Delphi 6,您应该将您的 Indy 组件更新到最新的 Indy v9 版本。

【讨论】:

  • 将不得不尝试这个,对于编程网络连接来说有点新,我只能解决这个问题。感谢您的帮助!一旦我跳出循环,我想我可以等待连接重新建立吗?还是我仍然需要关闭并重新打开该程序? (希望这个问题不要太傻)
  • @Ralre,通常情况下,您只需退出 OnExecute,让客户端建立另一个连接。
  • 太棒了,我会尽快试试这个!非常感谢您的帮助!
  • 一个更好的解决方案,以及如何使用TIdTCPServer,是让您完全摆脱try/except,让TIdTCPServer 处理引发的任何异常。如果在引发未捕获的异常时需要执行某些操作,可以使用 TIdTCPServer.OnException 事件。如果您必须在TIdTCPServer.OnExecute 事件中添加try/except,那么至少重新引发您捕获的任何EIdException 派生的异常,让服务器处理它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多