加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 使用Indy的HTTP连续打包流

发布时间:2020-12-15 04:07:51 所属栏目:大数据 来源:网络整理
导读:我有一个 JSON-RPC服务,其中一个请求返回一个连续的JSON对象流. 即: {id:'1'}{id:'2'}//30 minutes of no data{id:'3'}//... 当然,没有内容长度,因为流是无穷无尽的. 我正在使用自定义TStream后代来接收和解析数据.但内部TIdHttp缓冲数据,并且在收到RecvBuf
我有一个 JSON-RPC服务,其中一个请求返回一个连续的JSON对象流.

即:

{id:'1'}
{id:'2'}
//30 minutes of no data
{id:'3'}
//...

当然,没有内容长度,因为流是无穷无尽的.

我正在使用自定义TStream后代来接收和解析数据.但内部TIdHttp缓冲数据,并且在收到RecvBufferSize字节之前不会将其传递给我.

这导致:

{id:'1'} //received
{id:'2'} //buffered by Indy but not received
//30 minutes of no data
{id:'3'} //this is where Indy commits {id:'2'} to me

显然这不会做,因为30分钟前重要的信息应该在30分钟前送达.

我希望Indy能做套接字的工作:如果有可用数据则立即读取RecvBufferSize并立即返回.

我从2005年发现this discussion,其中一些可怜的灵魂试图向Indy开发者解释这个问题,但他们并不了解他. (阅读它;这是一个悲伤的景象)

无论如何,他通过编写自定义IOHandler后代来解决这个问题,但那是在2005年,也许今天有一些现成的解决方案?

解决方法

听起来像WebSocket任务,因为您的连接不再是简单的HTTP问题/答案,而是一个内容流.

有些代码请参见WebSocket server implementations for Delphi.

来自AsmProfiler的作者有at least one based on Indy.

AFAIK在websockets中有两种流:二进制和文本.我怀疑你的JSON流是一些文本内容,从websocket的角度来看.

另一种选择是使用long-pooling或一些较旧的协议,这些协议更易于管理 – 当连接切换到websockets模式时,它不再是标准的HTTP,因此一些“明智的”数据包检查工具(在公司网络上)可能将其识别为安全攻击(例如DoS),因此可以停止连接.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读