我有一个 JSON-RPC 服务,其中一个请求返回一个连续的 JSON 对象流。
IE :
{id:'1'}
{id:'2'}
//30 minutes of no data
{id:'3'}
//...
当然,没有 Content-Length,因为流是无穷无尽的。
我正在使用自定义 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 年开始,一些可怜的人试图向 Indy 开发人员解释这个问题,但他们不理解他。(读它;这是一个悲伤的景象)
无论如何,他通过编写自定义 IOHandler 后代来解决这个问题,但那是在 2005 年,也许今天有一些现成的解决方案?