You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Delphi与IdHTTPServer,能否改造视频流示例实现Server-sent events?

可以用Indy改造Delphi视频流Http Server实现Server-Sent Events(SSE)

完全可以,Indy的TIdHTTPServer具备实现SSE的所有必要特性,只要针对SSE的协议要求,调整原视频流示例的核心逻辑即可。以下是具体的改造要点:

核心改造步骤

1. 配置正确的响应头

在处理客户端请求时,必须返回符合SSE规范的响应头,除了你提到的两个头,建议补充Connection: keep-alive(显式声明持久连接),如果有跨域需求还需添加Access-Control-Allow-Origin: *:

AResponseInfo.ContentType := 'text/event-stream';
AResponseInfo.CacheControl := 'no-cache';
AResponseInfo.Connection := 'keep-alive';
AResponseInfo.ContentLength := -1; // 不指定固定长度,适配流式发送

2. 复用持久连接逻辑

原视频流示例本身就需要维持长连接来持续推送视频数据,这和SSE的持久连接要求完全匹配。只需确保TIdHTTPServer的KeepAlive属性设为True,且处理请求的线程不要主动关闭连接,直到客户端断开或服务器主动终止。

3. 替换数据发送格式

SSE要求消息遵循特定文本格式,核心规则:

  • 单条消息以data: 内容\n\n结尾(空行分隔消息)
  • 多行数据可拆分为多个data: 行内容,最后加空行
  • 可选添加id: 消息ID(用于重连时定位)、event: 事件类型(供浏览器监听特定事件)

把原示例中发送二进制视频帧的代码,替换为发送SSE格式的文本数据,比如定时推送服务器时间的示例:

while AContext.Connection.Connected do
begin
  // 构造SSE消息
  AContext.Connection.IOHandler.WriteLn('data: ' + DateTimeToStr(Now));
  AContext.Connection.IOHandler.WriteLn; // 空行结束当前消息

  // 控制推送频率,避免过度占用资源
  Sleep(1000);
  // 确保数据立即发送到客户端
  AContext.Connection.IOHandler.Flush;
end;

4. 异常与连接状态处理

在循环推送过程中,要实时检查客户端连接状态(AContext.Connection.Connected),同时捕获IO异常(比如客户端突然断开),避免线程崩溃:

try
  while AContext.Connection.Connected do
  begin
    // 发送SSE消息逻辑...
  end;
except
  on E: Exception do
  begin
    // 记录日志或做清理操作
    if not AContext.Connection.Connected then Exit;
  end;
end;

原视频流示例的适配要点

原示例的核心是循环发送流式数据,只需做以下替换:

  • 把视频流的Content-Type(如video/mp4)换成text/event-stream
  • 移除二进制视频帧的读取、编码逻辑,替换为SSE文本消息的构造
  • 保留原有的长连接维持逻辑,无需大幅改动线程模型

内容的提问来源于stack exchange,提问作者R.Schirru

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 19:40:23