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

前端之家收集整理的这篇文章主要介绍了delphi – 使用Indy的HTTP连续打包流前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个 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),因此可以停止连接.

猜你在找的Delphi相关文章