我正在將帶有 Indy 9 的舊 Delphi 2009 應用程式移植到帶有 Indy 10 的 Delphi 11:
// *************** Indy Version 9:
IdTCPClient1.Host := '123.456.789.012';
IdTCPClient1.Port := 123;
IdTCPClient1.Connect;
IdTCPClient1.OpenWriteBuffer;
IdTCPClient1.Write(Data);
i := IdTCPClient1.ReadInteger(True);
x := IdTCPClient1.ReadLn('</root>', 20000, 1500);
// Works OK
// *************** Indy Version 10
XMLStream := TMemoryStream.Create;
XMLDoc1.XML.SaveToStream(XMLStream);
IdTCPClient1.Host := '123.456.789.012';
IdTCPClient1.Port := 123;
IdTCPClient1.Connect;
IdTCPClient1.Socket.Open;
IdTCPClient1.Socket.WriteBufferOpen;
IdTCPClient1.Socket.Write(XMLStream, XMLStream.Size);
i := IdTCPClient1.Socket.ReadInt32(True);
x := IdTCPClient1.Socket.ReadLn('</root>', 20000, 1500);
// Socket Error # 10061 Connection refused.
兩個版本都在同一臺 PC/用戶中執行...任何幫助將不勝感激。弗朗西斯科
//Still receiving Socket Error # 10061: Connection Refused
IdTCPClient1.Host := '123.456.789.0';
IdTCPClient1.Port := 55065;
IdTCPClient1.Connect;
IdTCPClient1.Socket.WriteBufferOpen;
IdTCPClient1.Socket.Write(XMLStream, XMLStream.Size);
i := IdTCPClient1.Socket.ReadInt32(True);
sResp := IdTCPClient1.Socket.ReadLn('</root>', 20000, 1500);
IdTCPClient1.Socket.WriteBufferFlush;
IdTCPClient1.Socket.Close;
IdTCPClient1.Disconnect;
// I omitted some code like try, except
uj5u.com熱心網友回復:
您對 Indy 10 的翻譯不太正確。您根本不應該呼叫Socket.Open(),因為Connect()已經在內部處理了該呼叫,并且該Open()呼叫實際上是創建套接字并建立 TCP 連接。因此,您正在嘗試打開第二個連接,但這是行不通的。完全擺脫那個電話:
IdTCPClient1.Connect;
// IdTCPClient1.Socket.Open; // <-- get rid of this!
此外,在您的兩個代碼中,您都打開了 Indy 的內部寫入緩沖區,但是您在哪里重繪 /關閉它?只要緩沖區打開,您執行的任何寫入都將僅將其位元組存盤在緩沖區中,而不是通過套接字傳輸它們(除非您分配了緩沖區閾值,而您的示例沒有)。
// *************** Indy Version 9
IdTCPClient1.Connect;
IdTCPClient1.OpenWriteBuffer;
IdTCPClient1.Write(Data);
...
// where is the call to (Flush/Close/Cancel)WriteBuffer?
// *************** Indy Version 10
IdTCPClient1.Connect;
IdTCPClient1.Socket.WriteBufferOpen;
IdTCPClient1.Socket.Write(XMLStream, XMLStream.Size);
...
// where is the call to WriteBuffer(Flush/Close/Cancel)?
一般來說,您不需要使用 Indy 的寫入緩沖區,除非您發送大量資料并且會受益于緩沖可能為您提供的性能提升。默認情況下,TCP 已經在套接字自己的內部緩沖區中緩沖資料方面做得不錯,因此您通常也不需要在此之上使用 Indy 的寫緩沖。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/433792.html
上一篇:應用程式行為的工程外部實作
