2009-06-22 270 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」的主機....