我正在用Indy 9移植旧的Delphi 2009应用程序到Delphi 11和Indy 10:
// *************** 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发布于 2022-02-09 21:27:15
你对印地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://stackoverflow.com/questions/71055885
复制相似问题