0

我最近需要将一个旧的 Delphi 6 项目升级到 Delphi 2007。它是一个使用 Indy TidTCPServer 组件的服务器应用程序。我已经遵循了升级到 Indy 10 的所有示例。

该应用程序通过 TCP/IP 与旧的 VB6 应用程序(我们没有代码)接口。我遇到了困难,因为一旦 VB6 应用程序连接,Indy 组件上的 Execute 事件就会触发,但它不会写入任何数据。这会导致应用程序挂起,等待应用程序发送永远不会到达的数据。

原始代码如下所示:


data := AContext.Connection.IOHandler.ReadLn;
if data <> '' then
  begin
    // do some stuff
  end;

我已经尝试了 Indy 示例中的几个代码示例,以及 StackOverlow 上的示例。一个例子是:

AContext.Connection.IOHandler.CheckForDataOnSource(10);
如果不是 AContext.Connection.IOHandler.InputBufferIsEmpty 那么
  开始
    数据 := AContext.Connection.IOHandler.ReadLn();
    如果数据 <> '' 那么
      开始
        // 做一些事情
      结尾;
  结尾;

奇怪的是,当我使用 .NET 客户端访问原始代码时,它可以完美运行。这似乎只是来自 VB6 应用程序的问题。

4

3 回答 3

1

我相信 Indy 9 与 Delphi 6 一起提供,而 Indy 10 确实与 Delphi 2007 一起提供,所以问题似乎是 Indy 9 和 Indy 10 之间的差异。不幸的是,Indy 10 并不总是向后兼容。

以下是其中一些更改的简要概述 Indy 10 中的对象层次结构更改

有趣的部分是您说 Net 客户端连接良好...假设您的服务器未修改版本只是用 Delphi 2007 重新编译?如果是这样,那么听起来您可能已经安装了 Indy 10 来构建您的 Delphi 6 系统......

于 2009-06-23T03:30:34.737 回答
1

听起来是时候启动WireShark并查看实际发送/接收的内容了。这可能会给你你需要的线索。

我遇到了一个问题,导致我使用 C++Builder2009 从 Indy 9 升级到 Indy 10 时出现问题。Indy 9 中的 TIdTcpClient "Connect" 方法的声明大致如下

void Connect(int ConnectTimeout);

在 Indy10 中,“ConnectTimeout”现在是一个属性,并且 Connect 方法现在有一个类似这样的声明:

void Connect(String HostName);

所以我的旧代码是“Connect(5000);” 编译良好(因为有一个从 Int 到 String 的自动转换运算符)现在尝试连接到名为“5000”的主机......

于 2009-06-23T07:59:53.567 回答
1

问题解决了。以下代码有效...


AContext.Connection.IOHandler.CheckForDataOnSource(10);
  if not AContext.Connection.IOHandler.InputBufferIsEmpty then
    begin
      data := AContext.Connection.IOHandler.InputBuffer.Extract;

在仔细检查了流(如@Roddy 所建议的那样)之后,我能够确定 VB6 应用程序没有在连接上发送 CRLF,这导致AContext.Connection.IOHandler.ReadLn;阻塞等待从未出现的 CRLF。

感谢@Darian 和@Roddy 帮助我找到答案。

于 2009-06-24T15:27:26.857 回答