2009-06-22 273 views
0

我最近需要升级的老德尔福6项目德尔福2007年它是使用印TidTCPServer组件的服务器应用程序。我已经照着所有的例子我能找到的(即我们没有为代码),通过TCP/IP升级到印第安纳波利斯10TidTCPServer升级问题

应用程序接口与一个老VB6应用程序。我遇到困难时,因为Indy组件上的Execute事件一旦VB6应用程序连接就会触发,但它不会写入任何数据。这会导致应用程序挂起等待应用程序发送永远不会到达的数据。

原始代码看起来像:


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

我试过几个代码示例从印第安纳波利斯的例子,以及在这里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应用程序的一个问题。

回答

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帮助我找到答案。

1

相信印第安纳波利斯9附带德尔福6和印10不来用Delphi 2007,所以这个问题似乎是印第安纳波利斯9和印10.不幸之间的区别,印第安纳波利斯10并不总是向后兼容。

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

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

+0

@Darian - yup。当我用.NET客户端连接它时,在D2007中重新编译的原始代码完美工作。我可能不得不做@Roddy建议的东西,并使用像WireShark这样的工具。 – 2009-06-23 13:05:39

+0

由于它在D2007中没有改动而被重新编译,因此它默认安装了用于Delphi 6的Indy,之前进行了修改(否则它不会在没有代码修改的情况下编译)。我同意嗅探流量可能真的有帮助,但我还会在Delphi 6盒子上查看Indy文件的日期/时间,看看是否与其他人不同步,以查看默认的Indy行为是否在Delphi 6盒子上发生了变化。我希望有人不直接修改Indy代码,但它发生在... – 2009-06-24 04:07:39

1

听起来像是你需要启动WireShark,看看实际发送/接收的是什么。这可能会给你提供你需要的线索。

我不得不引起我升级从印第安纳波利斯9至10的Indy用C++ Builder2009问题的问题。在印9 TIdTcpClient“连接”方法具有声明大致是这样的

void Connect(int ConnectTimeout); 

在Indy10,“ConnectTimeout”现在是一个属性,并且连接方法现在具有类似于此的声明:

void Connect(String HostName); 

所以我的旧代码“Connect(5000);”编译罚款(因为从int到字符串的自动转换经营者)现在正试图连接到一个名为“5000”的主机....