TidTCPServer升级问题

时间:2009-06-22 20:47:41

标签: delphi indy

我最近需要将旧的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);
if not AContext.Connection.IOHandler.InputBufferIsEmpty then
  begin
    data := AContext.Connection.IOHandler.ReadLn();
    if data <> '' then
      begin
        // do some stuff
      end;
  end;

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

3 个答案:

答案 0 :(得分:1)

我相信Indy 9带有Delphi 6,而Indy 10带有Delphi 2007,所以问题似乎是Indy 9和Indy 10之间的差异。不幸的是,Indy 10并不总是向后兼容。

以下是其中一些变化的简要概述 Object Hierarchy Changes in Indy 10

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

答案 1 :(得分: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”的主机....

答案 2 :(得分: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帮我找到答案。