在Delphi中连接较少TCP客户端服务器应用程序

时间:2011-11-25 11:42:28

标签: delphi indy10

我正在创建一个客户端服务器应用程序,以连续流式传输图像,就像视频流应用程序一样。

客户端应用程序有一个计时器,每隔300毫秒计时一次,向服务器发送请求,服务器回复图像。

实现工作正常,但经过一段时间(~5分钟或更长时间后),两个应用程序都会冻结而没有任何错误消息(但很少有人收到消息说出系统资源)

之前情况更糟(约15秒后冻结)但我更改了idtcpserver1.terminatewaittime to 10 (from 5000 defalt) 现在它发生在5分钟后。

我无法理解错误发生的原因,但我确信使用基于计时器的请求并不好。

我可以将tcpserver转换为不可靠的无连接协议,以使其更快并减少请求压力。

但我不想使用UDP,因为它无法检测到损坏错误(但我不需要更正,我只想知道是否有任何错误(忽略整个图像))

procedure server.IdTCPServer1Execute(AContext: TIdContext);
begin
LLine := AContext.Connection.IOHandler.ReadLn();
AContext.Connection.IOHandler.Write(ast, 0, true);
end;

procedure client.timertick(Sender: TObject);
begin
IdTCPClient1.IOHandler.WriteLn(Edit1.Text);
LLine := TMemoryStream.Create;
IdTCPClient1.IOHandler.ReadStream(LLine, -1, false);
end;

只有与Indy相关的源代码才会被拒绝

===============更新后Remy Lebeau - TeamB和Arnaud Bouchez回答==========

感谢冻结是由于某些情况下图像无法访问造成的。 他们提到的工具帮助我追踪问题

但仍然没有解决主要问题

  

我可以将tcpserver转换为不可靠的无连接协议,以使其更快并减少请求压力。

2 个答案:

答案 0 :(得分:4)

您显示为内存泄漏的timertick代码。您没有释放您创建的TMemoryStream,这反过来会泄漏流在内部分配的任何内存。

TerminateWaitTimeout属性对连接的运行时行为没有影响。它仅在关闭服务器时使用,以指定服务器等待活动连接终止的时间。

TCP不适合流媒体,使用命令/响应来抓取图像的速度非常慢。至少摆脱帧之间的命令,只要帧可用就发送它们。 TCP可以处理。大多数音频/视频流应用程序都基于UDP,以避免TCP使用的不必要的开销。

答案 1 :(得分:3)

您有资源泄漏。

也许您没有释放您的网络资源或GDI资源。

  • 首先运行ProcessExplorer,然后查看您的应用程序创建的处理数量,以及创建的连接数量;
  • 然后在memory leak detection mode;
  • 中启动FastMM4
  • 如果您的资源未使用Delphi类映射,请尝试在代码中查找它们的分配/发布方式(使用带有API调用名称的Find IDE命令);
  • 这可能与线程问题有关 - 可能是某种竞争条件 - 尝试锁定您的共享资源;
  • 使用logging mechanism跟踪流程中发生的情况,尤其是所有Indy类;
  • 请参阅此StackOverflow answer中的其他提示。

UDP的一个有趣之处在于您可以一次广播流到多个目标。在客户端数量增加的情况下,通过减少带宽使用来平衡潜在的分组丢失。如果您需要使用有限资源的本地广播(但在互联网上会更复杂),值得研究这个方向。