Delphi TIdTCPServer-意外断开连接时等待重新连接

Delphi TIdTCPServer-意外断开连接时等待重新连接,delphi,indy,delphi-6,Delphi,Indy,Delphi 6,我有几个程序是用Delphi6和Indy组件开发的,我正试图找出一种方法,在出现意外断开连接的情况下,将TCP连接挂起 我们通过TCP连接到工厂地板上的PLC,无论出于何种原因,操作员弄乱了不该弄乱的东西,开关暂时断开,电线出现故障,或者无论发生什么情况,连接都会结束 这导致我们的程序难以锁定。一旦PLC和PC之间发生断开连接,程序将短暂停留并最终锁定 当PLC和PC之间发生断开连接时,是否有办法保持连接,并在不锁定程序的情况下重新建立连接 也许还有一种方法可以通过TIdTCPClient实现这

我有几个程序是用Delphi6和Indy组件开发的,我正试图找出一种方法,在出现意外断开连接的情况下,将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;

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

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


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

请显示一些代码。TIdTCPClient代码“玲珑”在哪里,它是否在循环中运行读/写套接字操作?您的代码是否使用empty except块抑制Indy socket操作的异常?目前,我遇到的问题最多的是当发生断开连接时IdTCPServer出现故障。对于IdTCPClient,我只是在寻找信息,因为我们不经常使用它,但有计划使用它。连接不断地在PLC和PC之间来回传递缓冲区,据我所知,没有异常抑制。我能找到的代码非常基本,但它与我们在任何地方都做的几乎相同。你确实将indy组件更新到了最新的indy9或更好的版本,10?D6附带的组件是iirc非SMP安全的。不,除了一些用于串行通信的组件外,这个版本的delphi几乎是骨灰级的。我们确实有德尔福7bone股票以及XE3,但对于该计划,我们目前有一个问题,它是在德尔福6。我相信我们可能会在Delphi7或XE3hope中重新编译,但我不必尝试这种编程网络连接的新方法,我只能自己解决这个问题。我感谢你的帮助!一旦我打破了循环,我想我可以等待连接重新建立自己?还是我仍然需要关闭并重新打开程序?希望这个问题不要太严重dumb@Ralre,特别是,您只需退出OnExecute,然后让客户端建立另一个连接。太棒了,我会尽快尝试!我真的很感谢你的帮助!一个更好的解决方案,以及如何使用TIdTCPServer,是让您完全摆脱try/except,让TIdTCPServer处理引发的任何异常。如果在引发未捕获异常时需要执行某些操作,可以使用TIdTCPServer.OnException事件来执行该操作。如果必须在TIdTCPServer.OnExecute事件中放置try/except,则至少重新引发捕获到的任何eideexception派生异常,让服务器处理它们。