【问题标题】:How to detect if a server is responding to requests with TIdTCPClient?如何检测服务器是否使用 TIdTCPClient 响应请求?
【发布时间】:2014-05-24 23:40:55
【问题描述】:

我想知道是否有办法以某种方式 ping 或发送一个空请求,以便使用 delphi 中的TIdTCPClient 查看来自给定服务器的响应(以及响应时间) - 我是什么试过是这样的:

TCPClient := TIdTCPClient.Create(nil);
responseStream := TMemoryStream.Create;
TCPClient.Host := someHost;
TCPClient.Port := somePort;
TCPClient.Connect;
startTime := Ticks;
TCPClient.IOHandler.ReadStream(responseStream, -1, True);
respTime := GetTickDiff(startTime, Ticks);
TCPClient.Disconnect;

在这个伪代码中我成功连接到 someHost:somePort 但显然我没有正确使用TCPClient.IOHandler.ReadStream - 有人可以帮我修复我的代码(我真的必须使用TIdTCPClient)或告诉我如何替换这些行那些工作不正常?

【问题讨论】:

  • 为什么你认为你没有正确使用它?会发生什么,您预计会发生什么?
  • @Rob at row TCPClient.IOHandler.ReadStream(responseStream, -1, True); 我的程序崩溃了,我不知道为什么。
  • 究竟是什么样的崩溃?请更具体。此外,您正在设置AReadUntilDisconnect=True,因此ReadStream() 将保持读取数据,直到服务器关闭连接。

标签: delphi tcpclient indy


【解决方案1】:

TCP 中没有空请求(UDP 中有)。如果要向 TCP 服务器发送请求,则请求中必须包含一些数据。此外,您连接的特定类型的服务器决定了您可以发送给它的请求类型,您不能只是连接并发送您想要的任何内容(嗯,您可以,但这并不能保证您会得到响应)。

按照您的代码当前的工作方式,它只能从向客户端发送初始问候语的服务器读取数据。大多数服务器不这样做。您从给定服务器获得响应的能力取决于该服务器实现的特定协议(HTTP、FTP、POP3、SMTP、IMAP 和 ...),因为它是决定请求和响应如何工作的协议。

因此,就您的问题而言,它无法回答,因为它太笼统了,可能性太多了。您需要缩小范围。

【讨论】:

  • 我也是这么想的,但我预计每种类型的服务器都会有一种方法以某种方式响应 indy 的一个库客户端。现在我确定这取决于服务器如何处理请求 - 再次感谢 Remy 的详细回答 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-01
  • 2012-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-07
相关资源
最近更新 更多