【问题标题】:Indy IdTCPClient + Firemonkey (iOS): OnConnect fires before a connection is established?Indy IdTCPClient + Firemonkey (iOS):OnConnect 在建立连接之前触发?
【发布时间】:2015-01-13 11:56:01
【问题描述】:

我正在尝试使用 Indy IdTCPClient 从 FireMonkey iOS 应用程序建立一个简单的 TCP 连接。在 FireMonkey 中使用的情况下,在成功连接到服务器之前,在 .Connect 之后立即触发 OnConnect。因此无法处理可能发生的连接异常。

我是唯一有这个问题的人还是我做错了什么?我用 XE7。

【问题讨论】:

  • Indy 有阻塞式通信,你根本不用事件?
  • 或许可以试试 OnConnected 事件。

标签: delphi firemonkey indy10


【解决方案1】:

OnConnected 事件在套接字物理连接到服务器之后、任何数据交换之前以及Connect() 退出之前立即触发。如果发生错误,则会引发异常。只需用 try/except 块包装 Connect() 即可捕获连接错误,例如:

try
  Client.Connect;
except
  // handle connection error
end;

由于 Indy 操作是阻塞的,你想在OnConnected 中使用的任何代码都可以在Connect() 退出后完成,例如:

//Client.OnConnected := ClientConnected;
try
  Client.Connect;
except
  // handle connection error
end;

...

procedure TMyForm.ClientConnected(Sender: TObject);
begin
  // connection successful, do something
end;

try
  Client.Connect;
except
  // handle connection error
  raise;
end;
// connection successful, do something

【讨论】:

  • VCL 应用程序就是这种情况。但不是通过 FireMonkey 应用程序。您的示例中的代码也正是我所做的。那就是问题所在。我故意提供错误的主机和端口。使用这些主机/端口,套接字无法物理连接,但 OnConnected 在 Connect() 之后仍会立即触发并尝试将数据发送到服务器。没有连接错误,什么都没有。
  • Indy 在所有平台上以相同的方式运行,在所有平台上使用相同的 BSD 兼容套接字 API。相信我,我是 Indy 的主要开发者,所以我知道 Connect() 不会按照您描述的方式运行。这是物理上不可能的正常条件。 OnConnected 可以触发的唯一方式是,如果操作系统在调用底层套接字 API connect() 函数时没有报告错误。如果成功,则已建立连接。也不要忘记非 IP Host 必须首先解析为 IP,因此另一个检查 Connect() 可能会因无效的 Host 而失败。
  • 您所描述的只有在 iOS 上破坏了 Delphi 的异常处理时才有可能,而且这种可能性极小。
  • Remy,我知道您是 Indy 开发人员,我 100% 信任您。我非常感谢您花费宝贵的时间来帮助解决我的问题。但这正是我所描述的。我刚刚安装了 iOS Simulator 7.1(8.1 还没有工作)并且代码在 sumulator 中完美运行。此问题仅影响设备。
  • 然后您将不得不在设备上调试您的应用程序并查看故障点实际在哪里。 Indy 期望 iOS 报告错误,如果是这样,则会引发异常。如果这没有发生,那么要么是 iOS 坏了,要么是 Delphi 坏了。 Indy 对除 Windows 之外的所有 FireMonkey 平台使用相同的套接字代码(实际上,相同的TIdStack 派生类)。更糟糕的情况是,编写一些代码来进行与 Indy 使用的相同的套接字 API 函数调用和异常引发调用,然后查看哪一个行为不端。
猜你喜欢
  • 2017-05-09
  • 2017-12-23
  • 2019-12-14
  • 1970-01-01
  • 1970-01-01
  • 2020-10-21
  • 1970-01-01
  • 1970-01-01
  • 2018-08-11
相关资源
最近更新 更多