我最近需要将旧的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应用程序的问题。
答案 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帮我找到答案。