我有一个
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开发者解释这个问题,但他们并不了解他. (阅读它;这是一个悲伤的景象)
解决方法
听起来像WebSocket任务,因为您的连接不再是简单的HTTP问题/答案,而是一个内容流.
有些代码请参见WebSocket server implementations for Delphi.
来自AsmProfiler的作者有at least one based on Indy.
AFAIK在websockets中有两种流:二进制和文本.我怀疑你的JSON流是一些文本内容,从websocket的角度来看.
另一种选择是使用long-pooling或一些较旧的协议,这些协议更易于管理 – 当连接切换到websockets模式时,它不再是标准的HTTP,因此一些“明智的”数据包检查工具(在公司网络上)可能将其识别为安全攻击(例如DoS),因此可以停止连接.