我正在创建一个客户端服务器应用程序,以连续流式传输图像,就像视频流应用程序一样。
客户端应用程序有一个计时器,每隔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转换为不可靠的无连接协议,以使其更快并减少请求压力。
答案 0 :(得分:4)
您显示为内存泄漏的timertick
代码。您没有释放您创建的TMemoryStream
,这反过来会泄漏流在内部分配的任何内存。
TerminateWaitTimeout
属性对连接的运行时行为没有影响。它仅在关闭服务器时使用,以指定服务器等待活动连接终止的时间。
TCP不适合流媒体,使用命令/响应来抓取图像的速度非常慢。至少摆脱帧之间的命令,只要帧可用就发送它们。 TCP可以处理。大多数音频/视频流应用程序都基于UDP,以避免TCP使用的不必要的开销。
答案 1 :(得分:3)
您有资源泄漏。
也许您没有释放您的网络资源或GDI资源。
UDP的一个有趣之处在于您可以一次将广播流到多个目标。在客户端数量增加的情况下,通过减少带宽使用来平衡潜在的分组丢失。如果您需要使用有限资源的本地广播(但在互联网上会更复杂),值得研究这个方向。