Indy 9 到 Indy 10 应用程序:连接被拒绝

Indy 9 to Indy 10 App: Connection refused

我正在将带有 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/User... 任何帮助将不胜感激。 弗朗西斯科

    //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

您对 Indy 10 的翻译不太正确。您根本不应该调用 Socket.Open(),因为 Connect() 已经在内部处理了,而 Open() 调用实际上是创建套接字并建立 TCP 连接的。因此,您正在尝试打开第二个连接,但这是行不通的。完全摆脱那个电话:

IdTCPClient1.Connect;
// IdTCPClient1.Socket.Open; // <-- get rid of this!

此外,在您的两个代码中,您都打开了 Indy 的内部写入缓冲区,但是您 flushing/closing 它在哪里?只要缓冲区处于打开状态,您执行的任何写入都只会将它们的字节存储在缓冲区中,而不会通过套接字传输它们(除非您分配了缓冲区阈值,而您的示例不是)。

// *************** 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 的写缓冲。